You have to explicitly specify an empty list (), if you want map to not "return" any items in case the if condition isn't true. Otherwise, map will return undef.
%ret = map{ $_->{key} =~/^a\d+/ ? ($_->{key} => $_->{value}) : () } @$ +data1;
The "odd number of elements in hash assignment" in your code resulted from those three undefs corresponding to the non-matching keys b1, b2 and c2. The first two created the hash entry '' => undef, the remaining one created the warning (because hash entries consist of key-value pairs, not a single value).
In reply to Re: map with empty item
by Eliya
in thread map with empty item
by remiah
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |