我有像这样的perl编码
@arr = qw(1 2 3 4);
print $arr[0],"\n";
print @arr[0],"\n";
Run Code Online (Sandbox Code Playgroud)
两个输出答案都是1然后,有什么区别?内存存储有什么不同吗?
使用@带有数组元素的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你的生产代码,因为它会减慢一切.如果您不理解警告,请使用它.
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |