in reply to Re^2: Homework question list
in thread Homework question list
Your example fails if @a1 or @a2 have a value more than once. For example, @a1 = (1, 2, 3, 2, 1) and @a2 = (4, 5, 6, 5, 4). Your grep would show 1, 2, 4, and 5 as elements existing in both arrays, when the right answer is obviously zero.
I will also disagree with cLive ;-) that "really smart people" use the undef'd hash slices to save memory - if memory is a concern, sure. But in general, the difference is not going to be significant. Premature optimisation and all that. I've even found sometimes where using the standard "++$hash{$value}" turns out to be handy three months later when the number of times a value shows up becomes relevant. I didn't need to change nearly as much code because I wasn't "really smart" according to cLive's definition.
Anyway, as always, TIMTOWTDI, so being able to use the undef'd hash slice is still a tool to keep handy:
Unfortunately, this has the side effect of showing duplicates if @a1 has a value, and @a2 has that value multiple times. Which, of course, may be what you want, but it's not explicit in the original requirement.my %a1; undef @a1{@a1}; my @in_both = grep { exists $a1{$_} } @a2;
Oh, and I also recommend better variable names than what I'm using here. :-)my (%a1, %a2); undef @a1{@a1}; undef @a2{@a2}; my @in_both = grep { exists $a1{$_} } keys %a2;
Update: Added the italicised part in the last line.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^4: Homework question list
by Aragorn (Curate) on May 22, 2005 at 20:09 UTC |