为什么Perl的autovivification在这种情况下有效?

时间:2009-11-18 22:07:55

标签: perl autovivification

有人可以帮助我理解这个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”仍在打印。

4 个答案:

答案 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}作为软参考。