Perl:如何使用'map'进行哈希分配?

use*_*275 2 perl hash variable-assignment

我无法理解如何使用该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
        };
Run Code Online (Sandbox Code Playgroud)

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

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

$VAR1 = [
          '',
          '',
          3,
          4
        ];
Run Code Online (Sandbox Code Playgroud)

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

如果不满足条件,是否有可能不返回空字符串?

dgw*_*dgw 7

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

#!/usr/bin/perl

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

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

返回空列表使得map行为类似于grep不满足条件时的行为.

>perl test.pl
$VAR1 = {
          '4' => 1,
          '3' => 1
        };
Run Code Online (Sandbox Code Playgroud)

  • 也可以把它写成`map {$ _ => 1} grep {$ _> 2} 1..4` (2认同)

cho*_*oba 5

map将列表转换为另一个列表.在第一种情况下,您的输入列表是1, 2, 3, 4.对于每个成员,如果成员是>= 2,则返回一个元组,否则,只返回一个值.单个值仅返回1并导致"奇数个元素".

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

input | output
------+-------
1     | ''
2     | ''
3     | 3 => 1
4     | 4 => 1
Run Code Online (Sandbox Code Playgroud)

如果从中创建哈希,则将第一个空字符串作为键,将第二个空字符串作为值,这将创建"哈希中的一个空字符串" - 实际上有两个.