首页 > 解决方案 > 怎么能 #?在不首先使用 @? 的情况下在取消引用的数组上使用?

问题描述

perl 中的数组像这样被取消引用,

my @array = @{$array_reference};

当尝试将数组分配给没有“@”的取消引用时,例如,

my @array = {$array_reference};

Perl 抛出错误“./sand.pl 第 22 行的匿名哈希中的奇数个元素”。我们不能将它分配给数组变量,因为 Perl 对类型感到困惑。

那么我们该如何表现...

my $lastindex = $#{$array_reference};

如果 Perl 难以理解 '{$array_reference}' 是一个数组类型?如果看起来像这样,对我来说会更有意义,

my $lastindex = $#@{$array_reference};

(尽管看起来更丑)。

标签: perlreference

解决方案


tl;dr:这是$#{$array_reference}为了匹配$#array.


{}有很多含义,而 Perl 就是这样。

有时{}会创建一个匿名哈希。这就是{$array_reference}正在做的事情,试图制作一个哈希,其中键是 的字符串化$array_reference,类似"ARRAY(0x7fb21e803280)"并且没有任何价值。因为您试图创建一个带有键但没有值的散列,所以您会收到“奇数个元素”警告。

有时{...}是一个块,如sub { ... }or if(...) { ... }, ordo {...}等​​等。

有时它是一个裸块,例如{ local $/; ... }.

有时它表示像$hash{key}or之类的哈希键$hash->{key}

前面有某些符号{}使取消引用明确。虽然您可以编写$#$array_reference或者@$array_reference有时您想要取消引用不是简单标量的东西。例如,如果您有一个返回数组引用的函数,您可以在一行中使用$#{ get_array_reference() }. 这是$#{$array_reference}为了匹配$#array.

$#{...}取消引用数组并获取索引。@{...}取消引用数组。%{...}取消引用哈希。${...}取消引用标量。*{...}取消引用一个 glob。

您可能会发现Modern Perl 中有关变量名称和符号的部分有助于更好地了解该模式。

如果这看起来像……对我来说会更有意义。

有很多这样的事情。Perl 自 1987 年以来就已经存在。很多这些设计决策都是在几十年前做出的。决定什么{}意思的代码特别复杂。数组和数组引用之间存在区别有点奇怪。


推荐阅读