【发布时间】:2019-04-19 15:06:42
【问题描述】:
我正在尝试解开一些遗留代码,如果它的大小大于 x(其中 x 是硬编码的 int),则对 $value 进行操作。这是它目前的样子:
if (scalar(@{$value}) > x) {
...
}
与所有遗留代码一样,这个 $value 几乎可以是任何东西(散列、标量、数组),尽管它应该是不同对象的数组。这段代码目前在大约 5% 的时间出现“不是数组引用”而失败,我试图找出可能破坏它的 $value 是什么。
我认为如果 $value 未定义它可能会失败,所以我什至给它一个 || [] 但无济于事(同样的错误):
if (scalar(@{$value || []}) > x) {
...
}
我也想弄清楚为什么我需要@{}?我的理解是,它在列表上下文中评估 $value ,以便标量以后可以确保我得到大小。这会使代码更健壮还是我可以直接使用标量 $value? @{} 甚至会做我认为的事情吗?
我正在使用 perl 5.8。
【问题讨论】:
-
$value 应该是对数组的引用。 @$value 是 $value 引用的数组。 scalar(@$value) 是该数组中包含的元素数。 scalar($value) 是一个类似 "ARRAY(0xce1460)" 的字符串。
-
“我使用的是 perl 5.8。” 为什么,哦,为什么? :-(
-
@DaveMitchell,先生,您刚刚重新连接了我的大脑。谢谢你。我不知道这会是一个参考。我只是假设 perl 做了一些疯狂的连接来把它变成一个标量上下文。太棒了!
-
@DaveCross 您不选择的两件事。您的父母以及当前运行您的旧系统的 perl 版本 :) 我感谢您的祈祷,哈哈