Access Menu

Site Navigation

« Better man | Main | Dutch handicap »

October 6, 2005

Encapsulated cleverness ~ Perl stuff

Is there anyone out there who can tell me what the following piece of code actually does?

@list_out = keys %{ {map {$_=>1} @list_in} };

If so then please leave a comment if you dare. I am willing to bet a good many euros that not a single person out there knows the answer to this abstract perlishness.

Reference

Posted at 6:40 AM

Trackback Pings

TrackBack URL for this entry:
http://www.kiffinsblog.com/cgi-bin/mt/mt-tb.cgi/136

5 Comment(s)

1 /

This uniqifies a list, which can be determined by looking at the individual pieces from the inside out:

map {$_=>1} @list_in

map() processes each element in @list_in, and for each element it returns a list (, 1). When put in braces:

{ map {$_=>1} @list_in }

it yields a reference to an anonymous hash with the (key, value)
pairs coming out of the map. The trick here is that when a key
which already exists in the hash comes out of @list_in again, the
original is overwritten by the new value.

To dereference a reference to a datastructure, you put it in braces preceded by the sigil of the type of the datastructure ('@' for arrays, '%' for hashes, '$' for scalars, etc.). So this:

%{ { map {$_=>1} @list_in } }

yields a hash. We're only interested in the keys, which are the
values of the @list_in array, uniqified, so we use the keys() builtin on the hash to get a list of the keys:

@list_out = %{ { map {$_=>1} @list_in } };

And we're done. The problem with this approach is that the order of the elements is not preserved. Using List::MoreUtils::uniq() (which is 2 lines of code), does preserve the order.

Posted by Arjen Laarhoven at October 6, 2005 12:10 PM

2 /

In record time as usual Arjen, shouldn't have expected anything less (although obviously a cut-and-paste sleight of hand). I guess I owe you.

Posted by Kiffin at October 6, 2005 12:35 PM

3 /

No cutting and pasting was involved, this is original content.

Posted by Arjen Laarhoven at October 6, 2005 12:46 PM

4 /

You're right, I was misled by your professional-looking content is all, and (unjustly) jumped to conclusions. Should have checked first. Keep up the good work.

Posted by Kiffin at October 6, 2005 12:54 PM

5 /

You're right, I was mislead by the professional-looking content is all, and (unjustly) jumped to conclusions. Should have checked first. Keep up the good work.

Posted by Kiffin at October 6, 2005 12:57 PM

Post a comment

Thanks for signing in, . Now you can comment. (sign out)

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)


Remember me?