有没有可以想象的区别
$x->{a}{b}
和
$x->{a}->{b}
对于任何允许的值$x->{a}
,在任何 perl 版本 >= 5.6 中?
不,这只是一个语法快捷方式,没有任何语义差异。
证明:编译时产生的操作码
$ perl -MO=Concise -e'$x->{a}{b}'
b <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
a <2> helem vK/2 ->b
8 <1> rv2hv[t3] sKR/1 ->9
7 <2> helem sKM/DREFHV,2 ->8
5 <1> rv2hv[t2] sKR/1 ->6
4 <1> rv2sv sKM/DREFHV,1 ->5
3 <#> gv[*x] s ->4
6 <$> const[PV "a"] s/BARE ->7
9 <$> const[PV "b"] s/BARE ->a
-e syntax OK
$ perl -MO=Concise -e'$x->{a}->{b}'
b <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
a <2> helem vK/2 ->b
8 <1> rv2hv[t3] sKR/1 ->9
7 <2> helem sKM/DREFHV,2 ->8
5 <1> rv2hv[t2] sKR/1 ->6
4 <1> rv2sv sKM/DREFHV,1 ->5
3 <#> gv[*x] s ->4
6 <$> const[PV "a"] s/BARE ->7
9 <$> const[PV "b"] s/BARE ->a
-e syntax OK
另请参阅perlref,使用参考部分,规则 3。
有些地方 -> 直到 5.6 之后才成为可选。我相信这些是一些:
$x->('a'){'b'} # coderef called, returning a reference
({a=>42})[0]{'a'} # reference from a list slice
构造是相同的。Perl 允许->
省略任何一对右括号和左括号之间的。
这有效,并打印OKOK
.
use strict;
use warnings;
my $data = {
a => {
b => [
sub { { c => 'OK' } }
]
}
};
print $data->{a}->{b}->[0]->()->{c};
print $data->{a}{b}[0](){'c'};