【问题标题】:Perl $$var -- two dollar signs as a sigil?Perl $$var - 两个美元符号作为符号?
【发布时间】:2023-03-30 12:32:03
【问题描述】:

这似乎是我应该能够轻松地在 Google、Bing 或 DDG 上搜索到的东西,但我对所有内容都一无所知。

基本上,我的任务是(部分)重写一组旧的 Perl 脚本。我自己不是 Perl 程序员,阅读这些脚本以弄清楚它们在做什么肯定有一个学习曲线,但我已经用这样的线条撞到了一堵绝对的砖墙:

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

据我所知,右侧是字典,或者更准确地说,它获取所述字典中键 'DESCRIPTION' 引用的值。但是它前面的“额外”美元符号是什么?

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

这个额外的美元符号在这里做什么?

【问题讨论】:

标签: perl


【解决方案1】:

这是取消引用的另一种形式。可以(老实说可能应该)写成:

$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";

【讨论】:

  • 谢谢!这样做和说:$script = $DEFAULT{SCRIPT};(有趣的是,这是我正在查看的脚本中的下一行)有什么区别?也就是说,同样的事情,但没有(显然,无论如何)任何解除引用?这是一个逻辑错误(当然,假设它是想要的字典的内容)?
  • 如果要访问整个数组,请使用@array。或者整个哈希,使用%hash。但是,要访问数组或散列的元素,您必须分别使用$array[3]$hash{key}。因此,在下一行中,%DEFAULT 是一个普通哈希,SCRIPT 是该哈希的一个键,其值被分配给 $script
  • 好的,现在我又回到不理解原来的位,因为我认为这就是我们在那里所做的。我想我只需要坐下来看一本“Perl 101”之类的书……
  • 关于解除引用的好文章:perlmeme.org/howtos/using_perl/dereferencing.html
  • 我认为$${} 符号早于$->{}。这可能会或可能不会告诉您有关程序或作者的年龄。
【解决方案2】:

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

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

在 Perl 中,

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

【讨论】:

  • 那是非常错误的。 引用内存地址之间有很大的区别。 Perl 不是 C,并且没有办法检索给定变量在内存中的位置。但是,您可以使用反斜杠 `` 运算符对任何 Perl 变量进行 引用,并且该引用可以存储在任何标量 Perl 变量中。原始变量可以通过取消引用任何对它的引用来访问
  • 我想使用地址隐喻,因为我认为它会有所帮助; OP 在后续行动中似乎不清楚参考资料的用途。但是,你是对的,它不是内存地址。我认为它更像是定义字典条目的哈希键的副本?编辑了我的答案。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2015-08-05
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多