« 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.

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)
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
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
No cutting and pasting was involved, this is original content.
Posted by Arjen Laarhoven at October 6, 2005 12:46 PM
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
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.)







