2

有没有可以想象的区别

$x->{a}{b}

$x->{a}->{b}

对于任何允许的值$x->{a},在任何 perl 版本 >= 5.6 中?

4

3 回答 3

10

不,这只是一个语法快捷方式,没有任何语义差异。

证明:编译时产生的操作码

$ 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。

于 2013-06-12T13:27:50.353 回答
2

有些地方 -> 直到 5.6 之后才成为可选。我相信这些是一些:

$x->('a'){'b'} # coderef called, returning a reference
({a=>42})[0]{'a'} # reference from a list slice
于 2013-06-12T13:34:41.437 回答
0

构造是相同的。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'};
于 2013-06-12T13:33:19.807 回答