Perl,`map` 函数的未知结果

use*_*716 5 arrays perl

我在print @squares下面的数组中得到了一个非常奇怪的结果;我应该得到 49 但我得到了一些随机数:

@numbers={-1,7};

my @squares = map { $_ > 5 ? ($_ * $_) : () } @numbers;

print @squares;
Run Code Online (Sandbox Code Playgroud)

$ perl g.pl

12909907697296

ike*_*ami 7

这是不正确的:

@numbers={-1,7};
Run Code Online (Sandbox Code Playgroud)

{ }构建散列并返回对散列的引用。以上等价于

my %anon = ( -1 => 7 );
@numbers = \%anon;
Run Code Online (Sandbox Code Playgroud)

被视为数字的引用将底层指针作为数字返回,因此您会得到垃圾。


要填充数组,请使用

my @numbers = ( -1, 7 );
Run Code Online (Sandbox Code Playgroud)

-1, 7返回两个数字,在分配给数组时将它们添加到数组中。(括号并不特殊;它们只是像数学一样覆盖优先级。)


完整的程序:

use 5.014;      # ALWAYS use `use strict;` or equivalent! This also provides `say`.
use warnings;   # ALWAYS use `use warnings;`!

my @numbers = ( -1, 7 );

my @squares = map { $_ > 5 ? ($_ * $_) : () } @numbers;

# Print each number on a separate line.
# Also provides the customary final line feed.
say for @squares;
Run Code Online (Sandbox Code Playgroud)

选择:

my @squares =
   map { $_ * $_ }
      grep { $_ > 5 }
         @numbers;
Run Code Online (Sandbox Code Playgroud)

  • `use 5.014;` 需要 Perl 5.14,但它也意味着 `use strict;` (对于 ≥5.012)和 `use feature "5.014";`。后者还提供了一些其他功能。从技术上讲,我可以使用“use 5.010;”,甚至是最有限的“use strict;”。使用功能 qw( 说 );`。但 5.14 已经广泛使用,现在已经有 9 岁了。 (3认同)