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

lzc*_*lzc -2 perl

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

DB<1> $record = "some value"
DB<2> $record->{default} = $record;
DB<3> use Data::Dumper
Run Code Online (Sandbox Code Playgroud)

会认为Dumper应该显示与步骤10相同的结果:

DB<4> print Dumper $record
$VAR1 = 'some value';

DB<5> $temp = $record
DB<6> $record->{default} = $temp
Run Code Online (Sandbox Code Playgroud)

至少在这种情况下,会认为Dumper会在第10步显示结果:

DB<7> print Dumper $record
$VAR1 = 'some value';
Run Code Online (Sandbox Code Playgroud)

你真的需要强行吗?

DB<8> undef $record
DB<9> $record->{default} = $temp
DB<10> print Dumper $record
$VAR1 = {
          'default' => 'some value'
        };
Run Code Online (Sandbox Code Playgroud)

我怎么能理解/解释为什么Perl没有"得到"我的意思?

cho*_*oba 6

在需要时创建散列或数组的过程称为自动生成.只有未定义的值才能自动生成.

请注意,没有严格 refs,以下工作:

my $record = 'some value';
$record->{default} = 'other value';
print $record, $record->{default};
Run Code Online (Sandbox Code Playgroud)

因为Perl会为您自动生成一个名为"some value"的变量,因为您可以验证:

print ${'some value'}{default};
Run Code Online (Sandbox Code Playgroud)


Sob*_*que 5

这就是你需要的原因use strict; use warnings;.

因为如果是这样 - 你做了什么,产生一个错误,告诉你问题:

Can't use string ("some value") as a HASH ref while "strict refs" 
Run Code Online (Sandbox Code Playgroud)

你特别想做的是:

"some value" -> {default} = "some value"; 
Run Code Online (Sandbox Code Playgroud)

这是没有意义的,因为你试图取消引用一个字符串值.