W jaki sposób łączysz tablice aliasów w Perlu tak, aby wynikowa tablica zawierała również aliasy?Jak mogę łączyć tablice aliasów w Perlu?
Rozwiązanie, które wymyśliłem to:
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
Co nie jestem szalony o to, że aby stworzyć $a3
muszę całkowicie rozpakować $a1
i $a2
. W przypadku krótkich tablic nie stanowi to problemu, ale wraz z rosnącymi danymi oznacza to, że wszystkie operacje tablicowe na tablicach z aliasami to O(n)
, w tym operacje tradycyjnie , takie jak push
lub unshift
.
Data::Alias
może pomóc, ale nie działa z najnowszymi wersjami Perla. Array::RefElem
zawiera opakowania wokół aproksymatorów api av_store
i av_push
, których można użyć do zaimplementowania tej funkcji. Tak więc coś takiego może zadziałać:
sub alias_push (\@@) {
if (eval {require Array::RefElem}) {
&Array::RefElem::av_push($_[0], $_) for @_[1 .. $#_]
} else {
$_[0] = sub {\@_}->(@{$_[0]}, @_[1 .. $#_])
}
}
Chciałbym wiedzieć, czy są jakieś inne sposoby. Szczególnie, jeśli istnieją inne sposoby wykorzystania tylko podstawowych modułów.
Myślę, że "fix Data :: Aliasy" może być najlepszą (choć może nie najszybszą) drogą. :) – Ether
@Ether => Czy masz pojęcie, jak głębokie są niezgodności? –
@Eric: nie, chociaż podejrzewam, że ktoś musi znaleźć tuit, aby go przenieść do korzystania z powiązań API 5.12. – Ether