perl中$ arr [0]和@arr [0]之间的区别是什么?

时间:2016-03-01 09:45:18

标签: arrays perl

我有这样的perl编码

{{1}}

两个输出答案都是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放入您的生产代码中,因为它会减慢所有内容的速度。如果您不了解警告,请使用它。

另见this answer by brian d foy