2010-10-07 8 views
6

¿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.

+1

Creo que "corregir datos :: Alias" podría ser el mejor (aunque quizás no el más rápido) camino a seguir. :) – Ether

+0

@Ether => ¿Alguna idea de cuán profundas son las incompatibilidades? –

+0

@Eric: no, aunque sospecho que alguien solo necesita encontrar un tuit para portarlo para usar los enlaces API 5.12. – Ether

Respuesta

1

¿Es este uno de los casos en los que es posible que desee una lista vinculada en Perl? Steve Lembark has a talk sobre los diversos casos en los que las personas deberían reconsiderar el arrastre y el despliegue de matrices.

Tengo curiosidad por qué tienes que hacer las cosas de esta manera. No es que sospeche algo extraño; Solo tengo curiosidad sobre el problema.

+0

la lista vinculada podría ser una buena solución, deja de lado los problemas 'O (n)'. la aplicación que tengo en mente es simular a Haskell como un comportamiento perezoso en Perl (principalmente porque creo que puedo :), me gustaría escribir algo como esto en Perl: 'fibs = 0: 1: zipWith (+) fibs (tail fibs) 'y parte de eso es administrar listas de argumentos que pueden contener valores que aún no se han definido (pero que serán cuando se necesiten) –

+0

Oh, en ese caso, espera un año y usa Perl 6 Las listas perezosas son una de las características más atractivas para mí. :) –

+0

@Eric, @brian, o tal vez Perl 5.1x? (donde x> 2 y x || 2) – Axeman

Cuestiones relacionadas