将标量变量及其值转换为hash ref变量的值

时间:2016-02-19 15:20:00

标签: perl

试图理解为什么以下不起作用:

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;我的意思是什么?

3 个答案:

答案 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拥有对匿名哈希的引用。