問題は、map
式がundef
の最初の要素に対して false の値を返すこと@array
です。そして、それはハッシュキーとして使用されているため、空の文字列に文字列化されます。 (コメントで、ボロディンはこの説明が間違っていると指摘しています。実際、空の文字列はexists
、キーが「1」のときに返される偽の値に由来します)
strict
a) 有効にし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
、反復ごとにゼロまたは 2 つの要素を返す必要があります。したがって、次のようなものが必要です。
#!/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'
};