Unfortunately, that version does not work in the case of a non-matching regex,
producing an invalid hash with an odd number of elements,
because a non-match produces an empty list (not undef).
It can be fixed with:
my %inc = map { $_ => ($content =~ /inc_$_=(.*?)\n/)[0] || undef }
qw(albums genres artists songs ratings year);
Update: The || above should be // to cater for the edge case of "inc_artists=0". Note that the // "defined or" operator was added to Perl 5.10. Note further that the low precedence version of this operator has morphed from err to dor to orelse; orelse is in
Perl 6
as a similar but not identical low precedence version of //, but not in Perl 5 AFAICT.
Test program to demonstrate follows. Running:
use strict;
use warnings;
use Data::Dumper;
my $content = <<'GROK';
inc_albums=albumvalue
inc_genres=genrevalue
inc_artists =artistvalue
inc_songs=songsvalue
inc_ratings=ratingsvalue
inc_year=yearvalue
GROK
{
my %inc = map { my ($v) = $content =~ /inc_$_=(.*?)\n/; $_ => $v }
qw(albums genres artists songs ratings year);
print Dumper(\%inc);
}
{
my %inc = map { $_ => ($content =~ /inc_$_=(.*?)\n/)[0]; }
qw(albums genres artists songs ratings year);
print Dumper(\%inc);
}
{
my %inc = map { $_ => ($content =~ /inc_$_=(.*?)\n/)[0] || undef }
qw(albums genres artists songs ratings year);
print Dumper(\%inc);
}
produces:
$VAR1 = {
'artists' => undef,
'ratings' => 'ratingsvalue',
'songs' => 'songsvalue',
'genres' => 'genrevalue',
'albums' => 'albumvalue',
'year' => 'yearvalue'
};
Odd number of elements in hash assignment at ff2.pl line 21.
$VAR1 = {
'ratingsvalue' => 'year',
'songsvalue' => 'ratings',
'artists' => 'songs',
'genres' => 'genrevalue',
'yearvalue' => undef,
'albums' => 'albumvalue'
};
$VAR1 = {
'artists' => undef,
'ratings' => 'ratingsvalue',
'songs' => 'songsvalue',
'genres' => 'genrevalue',
'albums' => 'albumvalue',
'year' => 'yearvalue'
};
|