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:

my %a1; undef @a1{@a1}; my @in_both = grep { exists $a1{$_} } @a2;
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, %a2); undef @a1{@a1}; undef @a2{@a2}; my @in_both = grep { exists $a1{$_} } keys %a2;
Oh, and I also recommend better variable names than what I'm using here. :-)

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
    The example isn't a real good one, I know. I was just playing around with variations on a theme, not trying to get a bullet-proof solution. But still, good point about the example :-)

    cLive ;-)'s solution is a variation on a theme explained in the Cookbook. I was under the impression that there existed some really nifty hash slice trick to get the results that I didn't know about, hence the question.

    In my production code, I use good variable names. When experimenting, I'm not as picky :-) I probably should be when posting code here.

    Thanks, Arjen