Arrays “的后果是什么?”$标量=@array[n]";?

Arrays “的后果是什么?”$标量=@array[n]";?,arrays,perl,slice,Arrays,Perl,Slice,下面是我运行/usr/bin/perl5.10.1 test.pl时的输出: use warnings; my @array = (0, 1); my $scalar1 = $array[0]; my $scalar2 = @array[0]; if($scalar1 == $scalar2) { print "scalars are equal\n"; } 我担心这个警告。可以获取单个元素的数组切片: Scalar value @array[0] better written as

下面是我运行
/usr/bin/perl5.10.1 test.pl
时的输出:

use warnings;
my @array = (0, 1);
my $scalar1 = $array[0];
my $scalar2 = @array[0];
if($scalar1 == $scalar2) {
    print "scalars are equal\n";
}

我担心这个警告。

可以获取单个元素的数组切片:

Scalar value @array[0] better written as $array[0] at test.pl line 4.
scalars are equal
但这通常意味着您犯了一个错误,Perl将警告您 应该写的是:

@fruits[1]; # array slice of one element

您可以在中查找所有警告消息,其中解释了后果:

(W语法)您使用了数组切片(由@表示)来选择 数组的单个元素。通常地 最好要求一个标量值 (以美元表示)。区别在于 $foo[&bar]的行为总是像 标量,分配给标量和 在评估其论点时 @foo[&bar]在以下情况下的行为类似于列表 您可以指定给它,并提供一个列表 上下文到它的下标,这可以 如果你只是在期待 一个下标

另一方面,如果你真的希望治疗这个阵列 元素作为列表,您需要查看 因为Perl 不会在两者之间神奇地转换 标量和列表。看见 佩尔雷夫

类似地,您也可以获得警告消息的详细解释


第三种方法是使用该实用程序。

使用该实用程序不会产生任何后果。我认为这样做的目的是帮助您避免在无法发出警告时产生的后果

“=”cause=“左侧的切片将成为列表赋值运算符

$fruits[1];
切片在列表上下文中计算索引

$ 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只是想告诉您,您将始终得到一个标量(单个元素)所以你也可以这样表示它——这是因为在接受列表的上下文中,单个元素总是被视为一个元素列表。
eq
是一个字符串运算符。你应该使用
=
来比较标量。字符串是标量……你的意思是“你应该使用
=
来比较数字吗?”“@Eric Strom,第二个事实上非常做作。我想不出一个现实的情况。如果有人认为他们可以用@rray[@rray]='new element'而不是$rray[@rray]='new element'获得类似推送的东西,怎么样
$ 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