Perl $$ var - 作为sigil的两个美元符号?

时间:2014-03-24 20:28:52

标签: perl

这似乎是我应该能够轻松地使用谷歌,必应或者DDG的东西,但是我对所有内容都是空洞的。

基本上,我的任务是(部分)重写一组旧的Perl脚本。我自己并不是Perl的程序员,在阅读这些脚本以确定他们正在做什么时,肯定是一个学习曲线,但是我用这样的行打了一个绝对的砖墙:

$comment = $$LOC{'DESCRIPTION'};

我可以说,右边是一本字典,或者更确切地说,它是获得所述字典中的密钥'DESCRIPTION'所引用的值。但是"额外"是什么?美元符号在它面前?

它看起来很像PHP variable variables,但在搜索引擎,各种StackExchange网站和perlvar之后,我无法找到Perl甚至的任何迹象这样的功能,更不用说这是它的调用方式。我发现的最多的是' $'不是变量名中的有效字符,所以我知道$$LOC不仅仅是调用恰好名为$LOC的变量。

这个多余的美元符号在这里做什么?

2 个答案:

答案 0 :(得分:32)

这是解除引用的另一种形式。可以(并且可能应该)写成:

$LOC->{'DESCRIPTION'};

您有时会看到与其他所有基本数据类型相同的内容:

my $str = 'a string';
my %hash = (a => 1, b => 2);
my @array = (1..4);

my $strref = \$str;
my $hashref = \%hash;
my $arrayref = \@array;

print "String value is $$strref\n";
print "Hash values are either $$hashref{a} or $hashref->{b}\n";
print "Array values are accessed by either $$arrayref[0] or $arrayref->[2]\n";

答案 1 :(得分:1)

取消引用将标量视为地址'您可以在其中找到另一个变量(标量,数组或散列)及其值。

在这种情况下,$ LOC {DESCRIPTION}被解释为另一个标量的地址,读入$ comment。

在Perl中,

my $str = 'some val';
my $ref = \$str;
my $val = ${$ref};
my $same_val = $$ref;