中没有列表上下文
$c = ($a, $b);
相反,您看到的是comma operator 的实际应用:
二进制“,”是逗号运算符。在标量上下文中,它评估其左参数,丢弃该值,然后评估其右参数并返回该值。这就像 C 的逗号运算符。
要更清楚地看到这一点,请查看:
#!/usr/bin/perl
use strict; use warnings;
my $x = {a => 1};
my $y = {a => 2, b => 0};
my $z = ($x, $y);
print "\$x = $x\t\$y = $y\t\$z = $z\n";
my @z = ($x, $y);
print "@z\n";
首先,我使用了warnings。因此,当我运行此脚本时,我收到警告:
Useless use of private variable in void context at C:\Temp\t.pl line 7.
始终启用警告。
现在,输出显示正在发生的事情:
$x = HASH(0x39cbc) $y = HASH(0x39dac) $z = HASH(0x39dac)
哈希(0x39cbc)哈希(0x39dac)
显然,$z 与 $y 所指的匿名哈希相同。没有复制值。
而且,$z[0] 与 $x 和 $z[1] 指代相同的匿名哈希,与 $y 和 $z 指代相同的匿名哈希。
请注意,单独的括号不会创建列表上下文。在
的情况下
my @z = ($x, $y);
它们是必要的,因为= 比逗号运算符绑定得更紧密。
my @z = $x, $y;
会将$x 分配给$z[0] 并丢弃$y(并发出警告)而
my @z = 1 .. 5;
会按预期工作。
最后,如果您想为$z 分配一个新的匿名哈希,其中包含$x 和$y 指向的匿名哈希的副本,您可以这样做
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
my $x = {a => 1};
my $y = {a => 2, b => 0};
my $z = { %$x, %$y };
print Dumper $z;
会输出:
$VAR1 = {
'a' => 2,
'b' => 0
};
因为根据定义,哈希键是唯一的。如果要保留与两个哈希的键关联的所有值,则需要做一些稍微复杂的事情(并使用匿名 arrayrefs 作为“联合”哈希中的值):
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
my $x = {a => 1};
my $y = {a => 2, b => 0};
my $z;
push @{ $z->{$_} }, $x->{$_} for keys %$x;
push @{ $z->{$_} }, $y->{$_} for keys %$y;
print Dumper $z;
输出:
VAR1 = {
'一个' => [
1、
2
],
'b' => [
0
]
};