$ x-> {a} {b}和$ x-> {a} - > {b}之间的差异

时间:2013-06-12 13:27:07

标签: perl

之间是否有任何可以想象的区别
$x->{a}{b}

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

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

有些地方 - &gt;直到5.6之后才成为可选项。我相信这些是:

$x->('a'){'b'} # coderef called, returning a reference
({a=>42})[0]{'a'} # reference from a list slice

答案 2 :(得分: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'};