in reply to map weirdness
What I want to achieve is that @b contains only the anonymous arrays which are found in @d, so i don't want the undef entries.
I can think of two major ways to obtain that result. One way would be if you leave map like it is but then use grep to filter out the undesired results:
@b = grep { ref $_ } @b;The other way would be to change the map so that it only returns what you want in the first place, something along these lines...
my @b=map { my $mapkey=$_; map { ($d[$mapkey]->[1] =~ /$a[$_]/) ? [@{$d[$mapkey]}] : () } 0..$#a } 0..$#d;
(This code is all untested.)
The first approach is probably easier to follow, if you're new to Perl. The second approach is more direct, however, probably more efficient, and definitely more concise.
Of course, if I were writing the thing, I'd get rid of those array indices and map over the lists themselves...
my @b = map { my $d = $_; map { ($d->[1] =~ $$_) ? $d : () } @a } @d
And if by =~ you really mean eq, we can simplify this further using a hash:
my %a = map { $_ => 1 } @a; my @b = map { ($a{$_->[1]}) ? $_ : () } @d
Note that this last one doesn't do exactly the same thing. With your sample data set it gets the same result, and I *suspect* that it actually does what you want, but now if @a were to contain "BUS", @d would no longer get [4,"BUS2"], only [3,"BUS"]. But it exorcises the nested map, which makes it easier to follow and more efficient, if it does what you want.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: map weirdness
by revdiablo (Prior) on Dec 13, 2004 at 19:18 UTC | |
by jonadab (Parson) on Dec 14, 2004 at 14:50 UTC |