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

SSN*_*SSN 0 arrays perl

我有像这样的perl编码

@arr = qw(1 2 3 4);

print $arr[0],"\n";
print @arr[0],"\n";
Run Code Online (Sandbox Code Playgroud)

两个输出答案都是1然后,有什么区别?内存存储有什么不同吗?

sim*_*que 5

使用@带有数组元素的sigil是使用带有单个元素列表的数组切片.如果你打开use warnings它会告诉你:

标量值@arr [0]在foo.pl第709行更好地写为$ arr [0]

如果你也是use diagnostics,它将解释相当多.

标量值@arr [0]在foo.pl第709行(#1)更好地写为$ arr [0]

(W语法)您已使用数组切片(由@表示)来选择数组的单个元素.通常,最好是要求标量值(用$表示).区别在于$ foo [&bar]在分配给它时和评估其参数时总是表现得像标量,而@foo [&bar]在分配给它时表现得像列表,并为其下标提供列表上下文如果你只期望一个下标,这可以做奇怪的事情.

另一方面,如果您实际上希望将数组元素视为列表,则需要查看引用的工作方式,因为Perl不会为您在标量和列表之间进行神奇的转换.见perlref.

所以一般来说,你应该使用变量调用返回的事物类型的sigil.对于单个数组元素,这是标量,因此您使用$.

使用@暗示它返回一个列表.数组本身返回一个列表,数组切片也是如此.在这里你用一个元素做了一个切片.这不是一个大问题,但也不是它的意图,这就是Perl警告你的原因.

只是use warnings,并且use strict(并声明你的变量my),并始终使用正确的sigil.

不要放入use diagnostics你的生产代码,因为它会减慢一切.如果您不理解警告,请使用它.

另见brian d foy的回答.

  • 它真的"老式"吗?它是如何与真正旧版本的Perl一起使用的?在二十年里,我一直在使用Perl,它始终是错的:-) (2认同)