すべての複雑な型が参照としてのみ利用できる他の多くの言語とは異なり、Perl には実際の単純なハッシュ型と、他の型へのプロキシとして機能する別の参照型があるため、それらは多少異なります。これに関する詳細はperlgutsにあります。
最後に、これら 2 つの例は両方とも同じストレージからデータをプルしますが、2 番目の呼び出しは、単純な HV への参照を忠実に作成し、要求どおりに逆参照することに時間を費やすため、少し長くなります。B::Concise
モジュールを使用して、ボンネットの下で何が起こっているかについての詳細を調べることができます。
%hash = ('a'=>1,'b'=>2);
print $hash{'b'};
print (\%hash)->{'b'};
簡潔な出力:
$ perl -MO=Concise deref.pl
t <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 deref.pl:1) v:{ ->3
b <2> aassign[t3] vKS ->c
- <1> ex-list lKP ->8
3 <0> pushmark s ->4
4 <$> const[PV "a"] s ->5
5 <$> const[IV 1] s ->6
6 <$> const[PV "b"] s ->7
7 <$> const[IV 2] s ->8
- <1> ex-list lK ->b
8 <0> pushmark s ->9
a <1> rv2hv[t2] lKRM*/1 ->b
9 <#> gv[*hash] s ->a
c <;> nextstate(main 1 deref.pl:2) v:{ ->d
i <@> print vK ->j
d <0> pushmark s ->e
h <2> helem sK/2 ->i
f <1> rv2hv sKR/1 ->g
e <#> gv[*hash] s ->f
g <$> const[PV "b"] s ->h
j <;> nextstate(main 1 deref.pl:3) v:{ ->k
s <2> helem vK/2 ->t
q <1> rv2hv[t7] sKR/1 ->r
p <@> print sK ->q
k <0> pushmark s ->l
o <1> refgen lK/1 ->p
- <1> ex-list lKRM ->o
l <0> pushmark sRM ->m
n <1> rv2hv[t6] lKRM/1 ->o
m <#> gv[*hash] s ->n
r <$> const[PV "b"] s ->s
deref.pl syntax OK