有人可以帮助我理解这个Perl程序的输出:
use Data::Dumper;
my %hash;
$hash{hello} = "foo";
$hash{hello}{world} = "bar";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);
输出:
foo
bar
$VAR1 = {
'hello' => 'foo'
};
“foo”来自哪里?怎么没有翻斗车打印出来?
请注意,如果我交换作业的顺序:
use Data::Dumper;
my %hash;
$hash{hello}{world} = "bar";
$hash{hello} = "foo";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);
我的输出是我所期望的:
foo
$VAR1 = {
'hello' => 'foo'
};
编辑:
我知道use strict;
会抓住这个,但我更感兴趣的是如何字符串“foo”仍在打印。
答案 0 :(得分:17)
您的代码丢失
use strict;
C:\Temp> hui Can't use string ("foo") as a HASH ref while "strict refs" in use at C:\Temp\hui.pl line 7.
确保所有脚本都以:
开头use strict;
use warnings;
假设:
$hash{hello} = "foo";
$hash{hello}
不哈希引用。
$hash{hello}{world} = "bar";
将字符串"foo"
视为哈希引用,并创建哈希%main::foo
并将$foo{world}
设置为"bar"
。
当你这样做时:
print Dumper \%hash;
它只打印%hash
的内容。然而,当你做的时候
print $hash{hello}{world} . "\n";
打印$foo{world}
。
如果没有strict
,您就不会发现脚本已经遍布包名称空间。
添加
print Dumper \%main::;
或
print Dumper \%main::foo;
在运行此符号表后检查符号表。
答案 1 :(得分:2)
字符串“foo”基本上是%hash
的唯一值,但是(由于非严格性)%foo正在创建,其中包含(world => "bar")
答案 2 :(得分:1)
如果你使用严格,你的脚本会出错。
在使用“严格参考”时,不能使用字符串(“foo”)作为HASH引用。
答案 3 :(得分:1)
仅当您以未定义的值开头时,自动生成才有效。由于您的$hash{hello}
不是未定义的值,因此您不会对下一级别进行自动生成。相反,您最终使用$hash{hello}
作为软参考。