perl - 为什么 Perl 的自动激活在这种情况下起作用?

标签 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'
        };

“福”从何而来?为什么dumper没有打印出来?

请注意,如果我交换任务的顺序:
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”仍在打印中。

最佳答案

您的代码丢失

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.

Make sure all your scripts start with:

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 ,您不会发现脚本已经在整个包 namespace 中进行了践踏。

添加一个
print Dumper \%main::;

或者
print Dumper \%main::foo;

运行后检查符号表。

关于perl - 为什么 Perl 的自动激活在这种情况下起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759488/

相关文章:

python - Python 的 defaultdict 的 Ruby 等价物是什么?

c - FreeBSD 以太网操作

perl - 如何使Mason2 UTF-8干净?

perl - 我可以为Perl中的所有信号设置一个信号处理程序吗?

perl - 为什么这个 oneliner - echo "hello"| perl -e '<>; print' 不起作用

perl - 从第一个键到最后一个(Perl)对哈希进行排序

perl - 如何检查 key 是否存在于深层 Perl 哈希中?

javascript - 自动生成和 Javascript

python - PERL-like autovivification with default value in Python, and returns a default value from non-existing arbitrary nesting?

使用 defaultdict 的 Python 单行树。如何减少所需参数的数量?