你的问题是,你的map
表达式返回
undef
在@array
第一元素的假值。
然后将它用作散列键,将其字符串化为空字符串。
(在评论鲍罗廷指出,这种解释是不正确。事实上空字符串来自于从exists
返回时,关键是“1”的假值)
你可能会得到更好的主意如果你a)开启了strict
和warnings
和b)使用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'
};
非常快,非常准确的。 – Jassi 2012-07-13 10:02:48
你对'undef'被串接为空字符串的解释是错误的*。您看到的空字符串是不存在的键的存在$ hash {$ _}的值。如果没有使用未初始化值的警告噪声,undef不会被转换为空字符串。 – Borodin 2012-07-13 10:26:43
谢谢。纠正。 – 2012-07-13 14:00:40