【问题标题】:What are the consequences of "$scalar = @array[n]"?“$scalar = @array[n]”的后果是什么?
【发布时间】:2023-03-05 08:59:01
【问题描述】:
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

我很担心这个警告。

【问题讨论】:

  • eq 是一个字符串运算符。您应该使用== 来比较标量。
  • 一个字符串是一个标量......当然你的意思是“你应该使用==来比较数字”。

标签: arrays perl slice


【解决方案1】:

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

“=”的 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

【讨论】:

  • @Eric Strom,第二个实际上非常做作。我想不出一个现实的情况。
  • 如果有人认为他们可以通过 @rray[@rray] = 'new element' 而不是 $ 获得类似 push 的东西怎么样? ray[@rray] = '新元素'
【解决方案2】:

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

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

另一方面,如果你真的希望处理数组 元素作为列表,您需要查看 了解引用是如何工作的,因为 Perl 不会神奇地转换 为您提供标量和列表。看 perlref.

同样,您可以use diagnostics; 获取警告消息的详细说明。

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

【讨论】:

    【解决方案3】:

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

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

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

    $fruits[1];
    

    【讨论】:

    • 那么,采用第一种方法的后果是什么。
    • 没有任何后果。 Perl 只是试图告诉您,您将始终得到一个标量(单个元素),因此您不妨这样表示它 - 这是因为在接受的上下文中,单个元素将始终被视为单元素列表列表。
    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多