use warnings;
my @array = (0, 1);
my $scalar1 = $array[0];
my $scalar2 = @array[0];
if($scalar1 == $scalar2) {
print "scalars are equal\n";
}下面是我运行/usr/bin/perl5.10.1 test.pl时的输出
Scalar value @array[0] better written as $array[0] at test.pl line 4.
scalars are equal我很担心这个警告。
发布于 2011-03-14 20:39:30
您可以在perldoc perldiag中查找所有警告消息,其中解释了后果:
(W语法)您已经使用数组切片(用@表示)来选择数组中的单个元素。通常,请求标量值(用$表示)会更好。不同之处在于,无论是赋值还是计算参数,$foo&bar总是像标量一样工作,而@foo&bar在你给它赋值时,它的行为就像一个列表,并为它的下标提供一个列表上下文,如果你只需要一个下标,这可能会做一些奇怪的事情。
另一方面,如果您实际上希望将数组元素视为列表,则需要研究引用是如何工作的,因为Perl不会为您神奇地在标量和列表之间进行转换。参见perlref。
类似地,您可以通过use diagnostics;获得警告消息的详细解释。
第三种方法是使用splain实用程序。
发布于 2011-03-14 20:00:53
可以获取单个元素的数组切片:
@fruits[1]; # array slice of one element但这通常意味着你犯了一个错误,Perl会警告你,你真正应该写的是:
$fruits[1];发布于 2011-03-15 01:34:10
这种用法不会有任何后果。我认为这样做的目的是为了帮助你避免在不能发出警告时的后果。
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切片在列表上下文中评估索引。
$ 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()]'
bhttps://stackoverflow.com/questions/5298208
复制相似问题