Perl中的引用如何工作

use*_*918 6 perl

任何人都可以push向我解释以下Perl代码中的声明吗?我知道perl如何工作但我无法理解跟随push命令的第一个参数代表什么.我试图解释某人的剧本.我试过,print "@a\n";但它只打印ARRAY(0x9aa370),这让我觉得推动没有做任何事情.任何帮助表示赞赏.谢谢!

my @a = (); 
my $b = 10;
my $c = 'a';
push(@{$a[$b]}, $c);
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 14

让我们分解吧.

@{...}从理解在perlref"使用引用"

在您将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何地方,您可以使用BLOCK替换标识符,返回正确类型的引用.

那么内部{ ... }块有什么更好的工作到数组引用.你有$a[$b]一个@aat索引$b元素,所以元素必须是一个arrayref.

然后@{...}取消引用它并为它添加push一个新元素$c.总而言之,$c将其复制到匿名数组的(唯一)元素中,该数组的引用位于数组的索引$b@a.

并且是一个关键部分:因为实际上没有arrayref ,自动生成启动并且它被创建.由于在$b它们之前的索引处没有元素,因此它们也是有价值的undef.

现在完成

同时perlref在开头使用链接进行完整参考.


对于复杂的数据结构,能够看到它们很有用,并且有工具可用.最常用的是Data :: Dumper核心,下面是Data :: Dump的示例

perl -MData::Dump=dd -wE'@ary = (1); push @{$ary[3]}, "ah"; dd \@ary'
Run Code Online (Sandbox Code Playgroud)

与输出

[1, undef, undef, ["ah"]]

其中[]inside表示一个arrayref,其唯一元素是字符串ah.


更确切地说,undef标量被解除引用,并且因为这发生在左值上下文中,所以自动归一化.感谢ikegami的评论.例如,请参阅此帖子及其链接.