"$ scalar = @array [n]"的后果是什么?

tsh*_*ang 4 arrays perl slice

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实用程序.


Nik*_*ain 5

可以采用单个元素的数组切片:

@fruits[1]; # array slice of one element
Run Code Online (Sandbox Code Playgroud)

但这通常意味着你犯了一个错误,Perl会警告你,你真正应该写的是:

$fruits[1];
Run Code Online (Sandbox Code Playgroud)

  • 那么,第一种方法的后果是什么呢? (2认同)

ike*_*ami 5

这种用法没有任何后果.我认为目的是帮助您避免在无法发出警告时产生的后果.

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)

  • 怎么样的人认为他们可以得到类似*push*with*@ rray [@rray] ='new element'*而不是*$ rray [@rray] ='new element'* (2认同)