我有这样的perl编码
{{1}}
两个输出答案都是1,那有什么区别? 内存存储有什么不同吗?
答案 0 :(得分:5)
将@
sigil与数组元素一起使用an array slice使用单个元素列表。如果您打开use warnings
,它会告诉您:
标量值@arr [0]在foo.pl第709行更好地写为$ arr [0]
如果你也use diagnostics
,它会解释相当多。
标量值@arr [0]在foo.pl第709行(#1)更好地写为$ arr [0]
(W语法)您已使用数组切片(由@表示)来选择a 数组的单个元素。一般来说,要求标量更好 价值(用$表示)。区别在于$ foo [& bar]总是如此 在分配给它时和评估时都表现得像一个标量 它的参数,而@foo [& bar]在分配时表现得像一个列表 它,并为其下标提供了一个列表上下文,这可能很奇怪 如果您只期望一个下标,那就是事情。
另一方面,如果你真的希望对待数组 作为列表的元素,您需要查看引用如何工作,因为 Perl不会为你提供标量和列表之间的神奇转换。 见perlref。
因此,通常,您应该使用变量调用返回的事物类型的符号。对于单个数组元素,即标量,因此您使用$
。
使用@
表示它返回一个列表。数组本身返回一个列表,数组切片也是如此。在这里你用一个元素做了一个切片。这不是一个大问题,但也不是它的意图,这就是为什么Perl警告你的原因。
只需use warnings
,还有use strict
(并使用my
声明您的变量),并始终使用正确的印记。
不要将use diagnostics
放入您的生产代码中,因为它会减慢所有内容的速度。如果您不了解警告,请使用它。