如何在Perl中连接别名数组?

Eri*_*rom 6 arrays perl alias

如何在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
Run Code Online (Sandbox Code Playgroud)

什么我不是疯狂的是,创建$a3我必须完全解压$a1$a2.对于短数组,这不是问题,但随着数据变大,这意味着对别名数组的所有数组操作都O(n)包括传统的O(1)操作,如pushunshift.

Data::Alias可以提供帮助,但它不适用于最新版本的Perl. Array::RefElem包含包装器的API原语av_storeav_push可用于实现这一功能.所以像这样的东西可以工作:

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

我很想知道是否有其他方法.特别是如果有任何其他方式仅使用核心模块.

bri*_*foy 1

这是您可能需要 Perl 中的链接列表的情况之一吗?Steve Lembark就人们应该重新考虑滚动和展开数组的各种情况进行了演讲。

我很好奇为什么你必须这样做。并不是说我怀疑有什么奇怪的事情;我只是对这个问题感到好奇。