试图理解为什么以下不起作用:
DB<1> $record = "some value"
DB<2> $record->{default} = $record;
DB<3> use Data::Dumper
会认为Dumper
应该显示与第10步相同的结果:
DB<4> print Dumper $record
$VAR1 = 'some value';
DB<5> $temp = $record
DB<6> $record->{default} = $temp
至少在这种情况下,我会认为Dumper
会将结果显示为第10步:
DB<7> print Dumper $record
$VAR1 = 'some value';
你真的需要强迫吗?
DB<8> undef $record
DB<9> $record->{default} = $temp
DB<10> print Dumper $record
$VAR1 = {
'default' => 'some value'
};
我如何理解/解释为什么Perl没有&#34;得到&#34;我的意思是什么?
答案 0 :(得分:6)
在需要时创建哈希或数组的过程称为 autovivification 。只有未定义的值才能自动生成。
请注意,如果没有strict refs
,则以下情况有效:
my $record = 'some value';
$record->{default} = 'other value';
print $record, $record->{default};
因为Perl自动修改了一个名为&#34的变量;某些值&#34;对你而言,你可以验证:
print ${'some value'}{default};
答案 1 :(得分:5)
这就是您需要use strict;
use warnings;
。
因为如果是这样 - 你做了什么,会产生一个错误,告诉你问题:
Can't use string ("some value") as a HASH ref while "strict refs"
你特别想做的是:
"some value" -> {default} = "some value";
这是没有意义的,因为您正在尝试取消引用字符串值。
答案 2 :(得分:1)
my $record = 'some value';
$record = { default => $record };
Perl是一种类型语言(虽然类型是标量,列表,哈希,而不是整数,浮点数等)。当您第一次分配给$record
时,它就变成了一个简单的标量。
然后,当perl
遇到$record->{default}
时,它意识到您正在尝试将此简单标量视为对哈希的引用。
另一方面,使用$record = { default => $record }
,您可以创建一个新的匿名哈希,并将其引用分配给$record
,覆盖之前保存的$record
。
Perl现在知道$record
拥有对匿名哈希的引用。