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.
Penso che "correggere Dati :: Alias" potrebbe essere la migliore (anche se forse non la più veloce). :) – Ether
@Ether => Qualche idea di quanto siano profonde le incompatibilità? –
@Eric: no, anche se ho il sospetto che qualcuno debba solo trovare un tuit per portarlo per utilizzare i binding API 5.12. – Ether