Cookie Notice

As far as I know, and as far as I remember, nothing in this page does anything with Cookies.

2010/08/23

Think Globally, Play With Hashes Locally

Reading a bit from Effective Perl Programming, I found out that Perl 5.12 supports deleting an element in a hash in a local scope. I was looking up from Higher Order Perl for a moment, so you might guess that my thoughts went to manipulating dispatch tables.

  1. my %subs = ( do  => sub { return 'c' },  
  2.              rey => sub { return 'd' },  
  3.              mi  => sub { return 'e' },  
  4.              fa  => sub { return 'f' },  
  5.              so  => sub { return 'g' },  
  6.              la  => sub { return 'a' },  
  7.              ti  => sub { return 'b' }, ) ;  
  8.   
  9. my @notes = qwdo rey mi fa so la ti do rum fmep agog ) ;  
  10.   
  11. {  
  12.     delete local $subs{ ti } ;  
  13.     say '=' x 20 ;  
  14.     for my $note ( @notes ) {  
  15.         if ( $subs$note } ) {  
  16.             my $sub = $subs$note } ;  
  17.             say join "\t"''$note, &$sub ;  
  18.             }  
  19.         }  
  20.     }  
  21.   
  22. say '-' x 20 ;  
  23. for my $note ( @notes ) {  
  24.     if ( $subs$note } ) {  
  25.         my $sub = $subs$note } ;  
  26.         say join "\t"''$note, &$sub ;  
  27.         }  
  28.     }  

====================
do c
rey d
mi e
fa f
so g
la a
do c
--------------------
do c
rey d
mi e
fa f
so g
la a
do c

Yeah, I'm still on 5.10. But that made me think.
Can you add to a hash only in the local scope?
  1. my %subs = ( do  => sub { return 'c' },  
  2.              rey => sub { return 'd' },  
  3.              mi  => sub { return 'e' },  
  4.              fa  => sub { return 'f' },  
  5.              so  => sub { return 'g' },  
  6.              la  => sub { return 'a' },  
  7.              ti  => sub { return 'b' }, ) ;  
  8.   
  9. my @notes = qwdo rey mi fa so la ti do rum fmep agog ) ;  
  10.   
  11. {  
  12.     local $subs{ rum } = sub { return 'one' }  ;  
  13.     say '=' x 20 ;  
  14.     for my $note ( @notes ) {  
  15.         if ( $subs$note } ) {  
  16.             my $sub = $subs$note } ;  
  17.             say join "\t"''$note, &$sub ;  
  18.             }  
  19.         }  
  20.     }  
  21.   
  22. say '-' x 20 ;  
  23. for my $note ( @notes ) {  
  24.     if ( $subs$note } ) {  
  25.         my $sub = $subs$note } ;  
  26.         say join "\t"''$note, &$sub ;  
  27.         }  
  28.     }  

====================
do c
rey d
mi e
fa f
so g
la a
ti b
do c
rum one
--------------------
do c
rey d
mi e
fa f
so g
la a
ti b
do c


Yeah, I'm still on 5.10. But that made me think.
And you might guess that it's a foregone conclusion that you can modify a hash element locally.
  1. my %subs = ( do  => sub { return 'c' },  
  2.              rey => sub { return 'd' },  
  3.              mi  => sub { return 'e' },  
  4.              fa  => sub { return 'f' },  
  5.              so  => sub { return 'g' },  
  6.              la  => sub { return 'a' },  
  7.              ti  => sub { return 'b' }, ) ;  
  8.   
  9. my @notes = qwdo rey mi fa so la ti do rum fmep agog ) ;  
  10.   
  11. {  
  12.     #delete local $subs{ ti } ;  
  13.     #local $subs{ rum } = sub { return 'one' }  ;  
  14.     local $subs{ ti } = sub { return 'FMEP' }  ;  
  15.     say '=' x 20 ;  
  16.     for my $note ( @notes ) {  
  17.         if ( $subs$note } ) {  
  18.             my $sub = $subs$note } ;  
  19.             say join "\t"''$note, &$sub ;  
  20.             }  
  21.         }  
  22.     }  
  23.   
  24. say '-' x 20 ;  
  25. for my $note ( @notes ) {  
  26.     if ( $subs$note } ) {  
  27.         my $sub = $subs$note } ;  
  28.         say join "\t"''$note, &$sub ;  
  29.         }  
  30.     }  

====================
do c
rey d
mi e
fa f
so g
la a
ti FMEP
do c
--------------------
do c
rey d
mi e
fa f
so g
la a
ti b
do c

The more I play with dispatch tables, the more I imagine practical uses of this. I love cool stuff!

2 comments:

  1. Installed 5.12 on a server I have access to, and yeah, the 5.12 local mojo works. So cool!

    ReplyDelete
  2. This comment has been removed by a blog administrator.

    ReplyDelete