{'b'}; #used when hashe-6ren">
gpt4 book ai didi

perl 引用散列的取消引用

转载 作者:行者123 更新时间:2023-12-04 01:21:40 27 4
gpt4 key购买 nike

考虑以下简单的代码:

%hash = ('a'=>1,'b'=>2); 
print $hash{'b'};
print "\n",(\%hash)->{'b'}; #used when hashes are passed by reference
#to subroutines

正如预期的那样,输出是一对 2。但我在想 $hash{key} 是否是作为 (\%hash)->{key} 完成的引用和取消引用的简写,或者它是达到相同结果的完全不同的途径。

请澄清一下。

最佳答案

它们有些不同,因为与许多其他语言不同,所有复杂类型都只能作为引用使用,Perl 具有实际的普通哈希类型和可以充当任何其他类型的代理的单独引用类型。您可以在 perlguts 中找到有关此的详细信息.

最后,这两个示例当然都从同一个存储中提取数据,但是第二次调用会更长一些,因为它会花时间尽职地创建对普通 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

关于perl 引用散列的取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com