perl - 怎么能 #?在不首先使用 @? 的情况下在取消引用的数组上使用?
问题描述
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};
(尽管看起来更丑)。
解决方案
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 年以来就已经存在。很多这些设计决策都是在几十年前做出的。决定什么{}
意思的代码特别复杂。数组和数组引用之间存在区别有点奇怪。
推荐阅读
- excel - I want to return to a previous month from a particular month (which are given in combo box) not from a date
- php - Laravel:从 json 类型字符串访问键值
- php - 在管理面板中为每个分类名称分配一个值(类)
- firebase - 不再接收 Firebase 云消息传递消息,即使我之前(立即)接收过,有时延迟 1 小时
- java - OLP CLI 错误:java.base 未将 sun.security.util 导出到 JDK 16 下的未命名模块
- ruby-on-rails - Rails Webpacker Angular javascript 文件大小明显大于原生 Angular javascript 文件大小
- android - 并非所有应用都在通知编号徽章列表中
- arrays - 如何从数组中获取最多 3 个第一个和最后一个项目
- excel - Dax 功能可将仪表板的多个度量合并为一个
- python-3.x - 来自 Bootstrap 5 Switch 框的 Fastapi 表单数据