【发布时间】:2019-07-14 13:50:27
【问题描述】:
我有一个包含 2 个哈希的脚本,在打印出内容时,我发现脚本在没有我做的情况下为第二个哈希分配了一个值。我通读了第一个散列,然后是第二个散列,然后通读了整个第二个散列。它应该只包含 hash2 中的 1 个条目,但它现在包含 2 个条目。 hash2 中 James 的值是如何在这里赋值的?
my %hash1 = ();
my %hash2 = ();
$hash1{"James"}{"1 Main Street"}++;
$hash1{"John"}{"2 Elm Street"}++;
$hash2{"John"}{"3 Oak Street"}++;
foreach my $name (keys %hash1) {
print "Hash1 Name $name\n";
foreach my $address (keys %{$hash1{$name}}) {
print "Hash1 Address $address\n";
foreach my $address (keys %{$hash2{$name}}) {
print "Hash2 Address $address\n";
}
}
}
print "\n";
foreach my $name (keys %hash2) {
print "Hash2 Name $name\n";
foreach my $address (keys %{$hash2{$name}}) {
print "Hash2 Address $address\n";
}
}
输出如下所示:
Hash1 Name James
Hash1 Address 1 Main Street
Hash1 Name John
Hash1 Address 2 Elm Street
Hash2 Address 3 Oak Street
Hash2 Name James
Hash2 Name John
Hash2 Address 3 Oak Street
【问题讨论】:
-
在不存在的值
$hash2{'James'}上应用散列取消引用%{}会触发空散列引用的autovivification,因此还会将键James添加到%hash2。跨度> -
@StefanBecker 不是所有的取消引用,只是那些被认为是更新的。不幸的是,这可能总是包含键
-
实际上,您创建了 4 个哈希元素而不分配给它们:
$hash1{"James"}、$hash1{"John"}、$hash2{"James"}和$hash2{"John"}。这都是由于自动复活。就像左值上下文中的$hash1{"James"}{"1 Main Street"}是${ $hash1{"James"} //= {} }{"1 Main Street"}的缩写,左值上下文中的%{$hash2{$name}}是%{ $hash2{$name} //= {} }的缩写。
标签: perl