Как вы объединяете массивы псевдонимов в Perl так, чтобы результирующий массив также содержал псевдонимы?
Решение, которое я придумал:
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
Я не без ума от того, чтобы создать $ a3
Мне нужно полностью распаковать $ a1
и $ a2
. Для коротких массивов это не проблема, но по мере роста данных это означает, что все операции над массивами с псевдонимами составляют O (n)
, включая традиционно O (1)
операции, такие как push
или unshift
.
Data :: Alias
может помочь, но он не работает с последние версии Perl. Array :: RefElem
содержит оболочки для примитивов api av_store
и av_push
, которые могут использоваться для реализации этой функциональности. Что-то вроде этого могло бы сработать:
sub alias_push (\@@) {
if (eval {require Array::RefElem}) {
&Array::RefElem::av_push($_[0], $_) for @_[1 .. $#_]
} else {
$_[0] = sub {\@_}->(@{$_[0]}, @_[1 .. $#_])
}
}
Мне интересно узнать, есть ли другие способы. Особенно, если есть другие способы использования только основных модулей.