根据我的基本理解,我们可以按如下方式访问哈希值:
$hash_name{key1}{key2}; #In case of an nested hash
$hash_reference->{key1}{key2} #if we have the reference to the hash instead of the hash we can access as
但在一个存档的代码中,我看到如下:
$sc1 = %par->{'a'}{'b'};
@a1 = %par->{'a'}{'c'};
%c3 = %par->{'a'}{'d'};
它究竟意味着什么?有人可以帮我这个吗?
答案 0 :(得分:4)
您发布的所有三种变体在use strict
下都会产生语法错误,而在Perl早于Perl 5.22的Perls上会发出use warnings
的警告。我在这里展示的输出来自Perl 5.20.1。
use strict;
use warnings;
my $par = { a => { b => 1, c => 2, d => 3 } };
my $sc1 = %par->{'a'}{'b'};
my @a1 = %par->{'a'}{'c'};
my %c3 = %par->{'a'}{'d'};
__END__
Using a hash as a reference is deprecated at /home/foo/code/scratch.pl line 700.
Using a hash as a reference is deprecated at /home/foo/code/scratch.pl line 701.
Using a hash as a reference is deprecated at /home/foo/code/scratch.pl line 702.
Global symbol "%par" requires explicit package name at /home/foo/code/scratch.pl line 700.
Global symbol "%par" requires explicit package name at /home/foo/code/scratch.pl line 701.
Global symbol "%par" requires explicit package name at /home/foo/code/scratch.pl line 702.
Execution of /home/foo/code/scratch.pl aborted due to compilation errors.
没有strict
和warnings
,它会编译,但会产生废话。
no strict;
no warnings;
use Data::Printer;
my $par = { a => { b => 1, c => 2, d => 3 } };
my $sc1 = %par->{'a'}{'b'};
my @a1 = %par->{'a'}{'c'};
my %c3 = %par->{'a'}{'d'};
p $sc1;
p @a1;
p %c3;
__END__
undef
[
[0] undef
]
{
'' undef
}
也就是说,Perl程序总是use strict
和use warnings
,并听取它向您显示的警告。
答案 1 :(得分:2)
这是早期perl版本的问题,其中包含类似
的表达式%par->{'a'}
将被默默地解释为
(\%par)->{'a'}
我不清楚这是否是一个错误,或者它是否是预期的行为。无论哪种方式,它都被声明为不合需要,并且首先被记录为弃用,然后更改为导致弃用警告,最后在Perl v5.22中它会导致致命错误,因此您的代码甚至不会再编译
不能使用哈希作为参考
其中任何一个都应该正确地写成
$par{'a'}
perldelta document for version 22 of Perl 5有此
使用哈希或数组作为参考现在是致命错误
例如,
%foo->{"bar"}
现在导致致命的编译错误。这些在v5.8之前已被弃用,并且从那时起就提出了弃用警告。
一般情况下,引用的三行应通过将%par->
替换为$par
来修复
$sc1 = $par{'a'}{'b'};
@a1 = $par{'a'}{'c'};
%c3 = $par{'a'}{'d'};
然而,第二个将@a1
设置为具有单个元素,并且最好可以写为@a1 = ( $par{'a'}{'c'} )
以强调它是列表赋值,第三个是将单个标量分配给哈希,这将导致警告
哈希分配中奇数个元素
所以语义错误以及语法