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



我有这样的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的答案。

最新更新