use warnings;
my @array = (0, 1);
my $scalar1 = $array[0];
my $scalar2 = @array[0];
if($scalar1 == $scalar2) {
print "scalars are equal\n";
}
Run Code Online (Sandbox Code Playgroud)
这是我运行时的输出/usr/bin/perl5.10.1 test.pl
:
Scalar value @array[0] better written as $array[0] at test.pl line 4.
scalars are equal
Run Code Online (Sandbox Code Playgroud)
我很担心这个警告.
too*_*lic 11
您可以在perldoc perldiag中查找所有警告消息,这解释了后果:
(W语法)您已使用数组切片(由@表示)来选择数组的单个元素.通常,最好是要求标量值(用$表示).区别在于$ foo [&bar]在分配给它时和评估其参数时总是表现得像标量,而@foo [&bar]在分配给它时表现得像列表,并为其下标提供列表上下文如果你只期望一个下标,这可以做奇怪的事情.
另一方面,如果您实际上希望将数组元素视为列表,则需要查看引用的工作方式,因为Perl不会为您在标量和列表之间进行神奇的转换.见perlref.
同样,您可以使用诊断; 获得警告信息的详细说明.
第三种方法是使用splain实用程序.
可以采用单个元素的数组切片:
@fruits[1]; # array slice of one element
Run Code Online (Sandbox Code Playgroud)
但这通常意味着你犯了一个错误,Perl会警告你,你真正应该写的是:
$fruits[1];
Run Code Online (Sandbox Code Playgroud)
这种用法没有任何后果.我认为目的是帮助您避免在无法发出警告时产生的后果.
LHS上的切片"="因为="是一个列表赋值运算符.
$ perl -E'sub f { return 4; } my $x = $a[1] = f(); say $x'
4
$ perl -E'sub f { return 4; } my $x = @a[1] = f(); say $x'
1
Run Code Online (Sandbox Code Playgroud)
切片评估列表上下文中的索引.
$ perl -E'sub f { my @i = 3; @i } @a=qw( a b c d e f ); say @a[f()]'
d
$ perl -E'sub f { my @i = 3; @i } @a=qw( a b c d e f ); say $a[f()]'
b
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
991 次 |
最近记录: |