Как мне объединить массивы псевдонимов в Perl?

Как вы объединяете массивы псевдонимов в 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 .. $#_])
    }
}

Мне интересно узнать, есть ли другие способы. Особенно, если есть другие способы использования только основных модулей.

6
задан brian d foy 7 October 2010 в 20:48
поделиться