whakka has asked for the wisdom of the Perl Monks concerning the following question:
Yields:switch ( $foo ) { case ( tr/I/I/ == 1 ) { $bar = 'low' } case ( tr/I/I/ == 2 ) { $bar = 'med' } case ( tr/I/I/ == 3 ) { $bar = 'high' } else { warn "Bad $_\n" } }
Use of uninitialized value $_ in transliteration (tr///)
(Update: Because switch doesn't set $_, it filters the source code - in this case "insanely".)
Here's a test script:Thanks!#!perl! -w use strict; use Switch; my $foo = 'II'; print $foo =~ tr/I/I/, "\n"; my $bar; switch ( $foo ) { case ( tr/I/I/ == 1 ) { $bar = 'low' } case ( tr/I/I/ == 2 ) { $bar = 'med' } case ( tr/I/I/ == 3 ) { $bar = 'high' } else { $bar = "drat" } } print "Foo: $foo Bar: $bar\n"; # This works: switch ( $foo ) { case ( /I{3}/ ) { $bar = 'high' } case ( /I{2}/ ) { $bar = 'med' } case ( /I/ ) { $bar = 'low' } else { $bar = "drat" } } print "Foo: $foo Bar: $bar\n";
Update: Thanks kyle and jeffa, the lesson is learned - don't use Switch. (jeffa's solution indeed doesn't work - which surprised me)
Update2: moritz has it right, use the (5.010) given-when construct:
given ( $foo ) { when ( tr/I/I/ == 1 ) { $bar = 'low' } when ( tr/I/I/ == 2 ) { $bar = 'med' } when ( tr/I/I/ == 3 ) { $bar = 'high' } default { $bar = "drat" } }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: switch, transliteration ( tr/// ) of $_ issue
by kyle (Abbot) on Nov 18, 2008 at 16:06 UTC | |
by moritz (Cardinal) on Nov 18, 2008 at 16:25 UTC | |
Re: switch, transliteration ( tr/// ) of $_ issue
by trwww (Priest) on Nov 18, 2008 at 17:40 UTC | |
Re: switch, transliteration ( tr/// ) of $_ issue
by jeffa (Bishop) on Nov 18, 2008 at 16:07 UTC | |
by Bloodnok (Vicar) on Nov 18, 2008 at 16:31 UTC | |
Re: switch, transliteration ( tr/// ) of $_ issue
by Roy Johnson (Monsignor) on Nov 18, 2008 at 21:53 UTC | |
Re: switch, transliteration ( tr/// ) of $_ issue
by runrig (Abbot) on Nov 18, 2008 at 22:15 UTC | |
by blazar (Canon) on Nov 19, 2008 at 11:40 UTC |