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

发布于 2024-10-21 23:57:45 字数 362 浏览 3 评论 0原文

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

我担心这个警告。

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

Here's the output when I run /usr/bin/perl5.10.1 test.pl:

Scalar value @array[0] better written as $array[0] at test.pl line 4.
scalars are equal

I'm concerned about that warning.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

三生一梦 2024-10-28 23:57:45

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

(W语法)您已使用数组切片(由@表示)来选择一个
数组的单个元素。一般来说
最好要求一个标量值
(用$表示)。区别在于
$foo[&bar] 总是表现得像
标量,在分配给它时和
在评估其论点时,同时
@foo[&bar] 的行为就像一个列表,当
您分配给它,并提供一个列表
其下标的上下文,可以这样做
如果你只期待奇怪的事情
一个下标。

另一方面,如果您确实希望处理数组
元素作为列表,您需要查看
了解引用是如何工作的,因为 Perl
不会神奇地在之间转换
为您提供标量和列表。看
佩尔参考。

同样,您可以使用诊断来获取警告消息的详细解释。

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

You can look up all warning messages in perldoc perldiag, which explains the consequences:

(W syntax) You've used an array slice (indicated by @) to select a
single element of an array. Generally
it's better to ask for a scalar value
(indicated by $). The difference is
that $foo[&bar] always behaves like a
scalar, both when assigning to it and
when evaluating its argument, while
@foo[&bar] behaves like a list when
you assign to it, and provides a list
context to its subscript, which can do
weird things if you're expecting only
one subscript.

On the other hand, if you were actually hoping to treat the array
element as a list, you need to look
into how references work, because Perl
will not magically convert between
scalars and lists for you. See
perlref.

Similarly, you can use diagnostics; to get this verbose explanation of the warning message.

A third way is to use the splain utility.

留一抹残留的笑 2024-10-28 23:57:45

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

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

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

$fruits[1];

It is possible to take an array slice of a single element:

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

but this usually means that you’ve made a mistake and Perl will warn you that what you really
should be writing is:

$fruits[1];
独孤求败 2024-10-28 23:57:45

该用法不会产生任何后果。我认为目的是帮助你避免无法发出警告时产生的后果。

“=”的 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()]'
b

There are no consequences for that usage. I think the purpose is to help you avoid the consequences when a warning can't be issued.

Slices on the LHS of "=" cause =" to be a list assignment operator.

$ 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

Slices evaluate the index in list context.

$ 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文