您的问题是您的map
表达式undef
为@array
. 当它被用作哈希键时,它被字符串化为一个空字符串。 (Borodin 在评论中指出这种解释是不正确的。实际上空字符串来自exists
键为“1”时返回的假值)
如果您 a) 打开并且 b) 在创建哈希后使用它来显示哈希,您可能会更好地了解正在strict
做warnings
什么Data::Dumper
。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @array = (1 .. 5);
my %hash = ( 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five' );
my %hash1 = map { $_=>$hash{$_} if(exists $hash{$_}) } @array;
say Dumper \%hash1;
这表明您最终得到了这样的哈希:
$ ./hash
Odd number of elements in hash assignment at ./hash line 12.
$VAR1 = {
'' => 2,
'three' => 4,
'five' => undef,
'two' => 3,
'four' => 5
};
您正在生成一个包含奇数个元素的列表。这不会产生快乐的哈希。
当你构建一个散列时,你需要确保你有偶数个元素。因此,当您使用时map
,每次迭代都需要返回零个或两个元素。所以你需要这样的东西:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @array = (1 .. 5);
my %hash = ( 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five' );
my %hash1 = map { exists $hash{$_} ? ($_ => $hash{$_}) : () } @array;
say Dumper \%hash1;
请注意,当在第一个哈希中找不到键时,我们会显式返回一个空列表。
$ ./hash2
$VAR1 = {
'4' => 'four',
'3' => 'three',
'2' => 'two',
'5' => 'five'
};