Perl:'map' 的散列赋值如何工作?

Perl: How does hash assignment with 'map' work?

我无法理解如何使用 map 函数分配给哈希值。

为什么

my %a = map {$_=>1 if $_>=2} (1..4);

时给我一个 Odd number of elements in hash assignment 错误

my %a = map {$_=>1 if $_>2} (1..4);

给我

$VAR1 = {
          '' => '',
          '4' => 1,
          '3' => 1
        };

为什么散列中只有一个空字符串?如果我分配给一个数组

my @a = map {$_ if $_>2} (1..4);

$VAR1 = [
          '',
          '',
          3,
          4
        ];

我得到两个空字符串,这对我来说更有意义。

有没有可能return不满足条件就没有空串?

map 将一个列表转换为另一个列表。在第一种情况下,您的输入列表是 1, 2, 3, 4。对于每个成员,如果该成员是 >= 2,则您 return 一个元组,否则,您 return 只是一个值。单个值仅对 1 进行 returned,并导致 "odd number of elements".

在第二种情况下,转换工作如下:

input | output
------+-------
1     | ''
2     | ''
3     | 3 => 1
4     | 4 => 1

如果从中进行散列,则将第一个空字符串作为键,将第二个空字符串作为值,这将创建 "one empty string in the hash" - 实际上有两个。

虽然 map 不是完成这项工作的最佳方式(grep 正如所指出的那样会更好),但仍然可以仅使用 map 与 ? 比较:

#!/usr/bin/perl

use strict ;
use warnings ;
use Data::Dumper ;

my %a = map { $_>2 ? ( $_ => 1 ) : () } (1..4) ;
print Dumper( \%a ) ;

返回空列表会使 map 在不满足条件时表现得像 grep

>perl test.pl
$VAR1 = {
          '4' => 1,
          '3' => 1
        };