¿Cómo se concatenan las matrices de alias en Perl de modo que la matriz resultante también contenga alias?¿Cómo puedo concatenar matrices de alias en Perl?
La solución que se me ocurrió es:
my ($x, $y, $z) = 1 .. 3;
my $a1 = sub {\@_}->($x);
my $a2 = sub {\@_}->($y, $z);
my $a3 = sub {\@_}->(@$a1, @$a2);
say "@$a3"; # 1 2 3
$_++ for $x, $y, $z;
say "@$a3"; # 2 3 4
Lo que no estoy loca por es que para crear $a3
Tengo que desempacar completamente $a1
y $a2
. Para matrices cortas esto no es un problema, pero a medida que los datos crecen, significa que todas las operaciones de matriz en matrices con alias son O(n)
, incluidas tradicionalmente O(1)
operaciones como push
o unshift
.
Data::Alias
podría ayudar, pero no funciona con las últimas versiones de Perl. Array::RefElem
contiene envolturas alrededor de las primitivas api av_store
y av_push
que se pueden utilizar para implementar esta funcionalidad. Entonces algo como esto podría funcionar:
sub alias_push (\@@) {
if (eval {require Array::RefElem}) {
&Array::RefElem::av_push($_[0], $_) for @_[1 .. $#_]
} else {
$_[0] = sub {\@_}->(@{$_[0]}, @_[1 .. $#_])
}
}
Estoy interesado en saber si hay otras formas. Particularmente si hay otras formas de usar solo los módulos principales.
Creo que "corregir datos :: Alias" podría ser el mejor (aunque quizás no el más rápido) camino a seguir. :) – Ether
@Ether => ¿Alguna idea de cuán profundas son las incompatibilidades? –
@Eric: no, aunque sospecho que alguien solo necesita encontrar un tuit para portarlo para usar los enlaces API 5.12. – Ether