#!/usr/bin/perl
# Idiom #281 Use a Point as a map key
sub new { my $class = shift ; bless { @_ } , $class }
sub x { shift-> { x} } ;
use overload '""' => sub { shift-> _stringify( ) } ;
sub _stringify {
}
}
my @points ;
foreach my $x ( 1 .. 3 ) {
foreach my $y ( 10 .. 12 ) {
my $p = Point
-> new ( x
=> $x , y => $y ) ; $m { $p } = $p ;
}
}
for ( 1 .. 5 ) {
my $r = $points [ int rand @points ] ; printf "picked point %s got point %s\n " , $r , $m { $r } ; }
# for the posted idiom
my $p = Point
-> new ( x
=> 42 , y => 5 ) ; $m { $p } = 'Hello' ;
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMyODEgVXNlIGEgUG9pbnQgYXMgYSBtYXAga2V5CgpwYWNrYWdlIFBvaW50IHsKICAgIHN1YiBuZXcgeyBteSAkY2xhc3MgPSBzaGlmdDsgYmxlc3MgeyBAXyB9LCAkY2xhc3MgfSAgICAKCiAgICBzdWIgeCB7IHNoaWZ0LT57eH0gfTsKICAgIHN1YiB5IHsgc2hpZnQtPnt5fSB9OwogICAgCiAgICB1c2Ugb3ZlcmxvYWQgJyIiJyA9PiBzdWIgeyBzaGlmdC0+X3N0cmluZ2lmeSgpIH07ICAgCgogICAgc3ViIF9zdHJpbmdpZnkgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgcmV0dXJuIHNwcmludGYgIiglcywgJXMpIiwgJHNlbGYtPngsICRzZWxmLT55OyAKICAgIH0KfQoKbXkgJW07Cm15IEBwb2ludHM7CmZvcmVhY2ggbXkgJHggKDEuLjMpIHsKICAgIGZvcmVhY2ggbXkgJHkgKDEwLi4xMikgewogICAgICAgIG15ICRwID0gUG9pbnQtPm5ldyh4ID0+ICR4LCB5ID0+ICR5KTsgICAgICAgICAgICAgICAKICAgICAgICBwdXNoIEBwb2ludHMsICRwOwogICAgICAgICRteyRwfSA9ICRwOwogICAgfQp9IAoKZm9yICgxLi41KSB7CiAgICBteSAkciA9ICRwb2ludHNbIGludCByYW5kIEBwb2ludHMgXTsKICAgIHByaW50ZiAicGlja2VkIHBvaW50ICVzIGdvdCBwb2ludCAlc1xuIiwgJHIsICRteyRyfTsKfQoKCiMgZm9yIHRoZSBwb3N0ZWQgaWRpb20KCm15ICVtOwpteSAkcCA9IFBvaW50LT5uZXcoeCA9PiA0MiwgeSA9PiA1KTsKJG17JHB9ID0gJ0hlbGxvJzsKCnByaW50ICIkcCA9ICRteyRwfSI7
stdout
picked point (2, 11) got point (2, 11)
picked point (1, 11) got point (1, 11)
picked point (3, 11) got point (3, 11)
picked point (3, 10) got point (3, 10)
picked point (3, 12) got point (3, 12)
(42, 5) = Hello