我有这样的perl编码
@arr = qw(1 2 3 4);
print $arr[0],"n";
print @arr[0],"n";
两个输出答案都是 1,那么有什么区别?内存存储有什么区别吗?
将@
符号与数组元素一起使用是使用具有单个元素列表的数组切片。如果您打开use warnings
它会告诉您:
标量值 @arr[0] 最好写为 $arr[0] 在第 709 行 foo.pl
如果你也use diagnostics
,它会解释很多。
标量值 @arr[0] 最好写为 $arr[0] 在第 709 行 709 foo.pl
(W 语法)您已使用数组切片(由 @ 指示)来选择 数组的单个元素。 一般来说,最好要求标量 值(由 $ 表示)。 不同的是,$foo[&bar]总是 行为类似于标量,无论是在分配给标量还是在评估时 它的参数,而 @foo[&bar] 在您分配 它,并为其下标提供了一个列表上下文,这可能会很奇怪 如果您只期望一个下标,则为
。另一方面,如果您实际上希望处理数组 元素作为列表,您需要研究引用的工作原理,因为 Perl 不会为你神奇地在标量和列表之间转换。 见佩尔雷夫。
因此,一般来说,您应该使用变量调用返回的事物类型的符号。对于单个数组元素,即标量,因此使用 $
.
使用 @
意味着它返回一个列表。数组本身返回一个列表,数组切片也是如此。在这里,你用一个元素做了一个切片。这不是一个大问题,但也不是它想要的方式,这就是为什么Perl警告你。
只需use warnings
,也use strict
(并用my
声明变量),并始终使用正确的符号。
不要将use diagnostics
放入生产代码中,因为它会减慢所有内容。如果您不理解警告,请使用它。
另请参阅Brian d Foy的答案。