2010-10-07 2 views
6

Come si concatenano gli array di alias in Perl in modo tale che l'array risultante contenga anche alias?Come concatenare matrici di alias in Perl?

La soluzione che mi è venuto in mente è:

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 

Quello che non mi fa impazzire è quello di creare $a3 devo disfare completamente $a1 e $a2. Per gli array corti questo non è un problema, ma man mano che i dati aumentano, significa che tutte le operazioni sugli array con alias sono O(n), incluse le tradizionali operazioni O(1) come push o unshift.

Data::Alias potrebbe aiutare, ma non funziona con le ultime versioni di Perl. Array::RefElem contiene wrapper attorno alle primitive api av_store e av_push che possono essere utilizzate per implementare questa funzionalità. Quindi qualcosa del genere potrebbe funzionare:

sub alias_push (\@@) { 
    if (eval {require Array::RefElem}) { 
     &Array::RefElem::av_push($_[0], $_) for @_[1 .. $#_] 
    } else { 
     $_[0] = sub {\@_}->(@{$_[0]}, @_[1 .. $#_]) 
    } 
} 

Sono interessato a sapere se ci sono altri modi. In particolare se ci sono altri modi usando solo i moduli core.

+1

Penso che "correggere Dati :: Alias" potrebbe essere la migliore (anche se forse non la più veloce). :) – Ether

+0

@Ether => Qualche idea di quanto siano profonde le incompatibilità? –

+0

@Eric: no, anche se ho il sospetto che qualcuno debba solo trovare un tuit per portarlo per utilizzare i binding API 5.12. – Ether

risposta

1

Questo è uno dei casi in cui è possibile che si desideri un elenco collegato in Perl? Steve Lembark has a talk sui vari casi in cui le persone dovrebbero riconsiderare gli array di laminazione e srotolamento.

Sono curioso di sapere perché devi fare le cose in questo modo. Non che io sospetti qualcosa di strano; Sono solo curioso del problema.

+0

l'elenco collegato potrebbe essere una buona soluzione, si allontana piacevolmente i problemi 'O (n)'. l'applicazione che ho in mente è simulare il comportamento pigro di Haskell in Perl (principalmente solo perché penso di poterlo fare :), mi piacerebbe scrivere qualcosa di simile in Perl: 'fibs = 0: 1: zipWith (+ fibs (tail fibs) 'e parte di esso è la gestione degli elenchi di argomenti che possono contenere valori che non sono ancora stati definiti (ma sarà il tempo necessario) –

+0

Oh, in tal caso, attendere un anno e utilizzare Perl 6 Le liste pigre sono una delle caratteristiche più interessanti per me. :) –

+0

@Eric, @brian, o forse Perl 5.1x? (dove x> 2 e x || 2) – Axeman