首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"$scalar = @array[n]“的后果是什么?

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

Stack Overflow用户
提问于 2011-03-14 19:55:56
回答 3查看 1K关注 0票数 5
代码语言:javascript
复制
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时的输出

代码语言:javascript
复制
Scalar value @array[0] better written as $array[0] at test.pl line 4.
scalars are equal

我很担心这个警告。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-14 20:39:30

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

(W语法)您已经使用数组切片(用@表示)来选择数组中的单个元素。通常,请求标量值(用$表示)会更好。不同之处在于,无论是赋值还是计算参数,$foo&bar总是像标量一样工作,而@foo&bar在你给它赋值时,它的行为就像一个列表,并为它的下标提供一个列表上下文,如果你只需要一个下标,这可能会做一些奇怪的事情。

另一方面,如果您实际上希望将数组元素视为列表,则需要研究引用是如何工作的,因为Perl不会为您神奇地在标量和列表之间进行转换。参见perlref。

类似地,您可以通过use diagnostics;获得警告消息的详细解释。

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

票数 11
EN

Stack Overflow用户

发布于 2011-03-14 20:00:53

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

代码语言:javascript
复制
@fruits[1]; # array slice of one element

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

代码语言:javascript
复制
$fruits[1];
票数 5
EN

Stack Overflow用户

发布于 2011-03-15 01:34:10

这种用法不会有任何后果。我认为这样做的目的是为了帮助你避免在不能发出警告时的后果。

LHS上的切片"=“原因=”是一个列表赋值运算符。

代码语言:javascript
复制
$ 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

切片在列表上下文中评估索引。

代码语言:javascript
复制
$ 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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5298208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档