tROCK has asked for the wisdom of the Perl Monks concerning the following question:

I was wondering if there was a command in Perl similar to "CASE" found in other programming languages?

Thank you in advance.

By the way... excellent site.

Replies are listed 'Best First'.
RE: CASE statement in Perl?
by arturo (Vicar) on Oct 23, 2000 at 19:49 UTC

    There is no built-in case statement in Perl, but you can build one using a hash and references to subroutines. This is more like a switch, but the principles are the same.

    # $action_string is set to something or other. # actions is a hash whose keys are strings and whose values # are references to subroutines my %actions = ( 'display'=> \&show_values(), 'set'=> \&set_values(), 'default' => \&default() ); $action_string = 'default' unless defined($action{$action_string}); $action{$action_string}->(); # calls the subroutine that this hash val +ue is a reference to sub set_values { # do something } sub show_values { # do something }

    Philosophy can be made out of anything. Or less -- Jerry A. Fodor

Re: CASE statement in Perl?
by KM (Priest) on Oct 23, 2000 at 19:46 UTC
    This is in the FAQ, perldoc -q CASE
    There is also a Switch.pm on CPAN under DCONWAY.

    Cheers,
    KM

RE: CASE statement in Perl?
by mitd (Curate) on Oct 23, 2000 at 20:02 UTC
    Once you locate the right FAQ at perlman:perlfaq as per merlyn it will direct to a more detail explaination at perlman:perlsyn.

    reading->clues->information->knowledge->wife|kids->wisdom

    MitD -- Made in the Dark
    'My favourite colour appears to be grey.'

(switch using for) RE: CASE statement in Perl?
by mwp (Hermit) on Oct 24, 2000 at 09:09 UTC

    I'm sure this is covered in one of the documents linked in the above posts, but just the same, here's what I usually do to counter my many-else-if blues:

    # SWITCH: for(thing to check) { # /regexp/ && do { condition 1; last SWITCH; }; # (condition) && do { condition 2; last SWITCH; }; # do { catch all }; # }

    This works by setting the default variable ($_) to the thing to check and performing regexps or condition ops on the default variable. The nice thing about this structure is that it's very flexible: you can use an array or scalar as the thing-to-check, you can forego the last statements and have multiple statement blocks apply, you can combine regular expressions with conditional expressions, etc. I use this structure to check for variable types sometimes, sort of a generic want function.

    $ref = \@array; # or, $ref = \%hash; # or, $ref = \$scalar; SWITCH: for(ref $ref) { # check variable type of referent # $ref is still our reference scalar # now $_ contains the referent variable type # (eg, ARRAY, SCALAR, HASH, or object class) /array/i && do { # do something with @$ref last SWITCH; }; /scalar/i && do { # do something with $$ref last SWITCH; }; /hash/i && do { # do something with %$ref last SWITCH; }; do { # panic, we have no handler for this variable type! die "don't know what to do with ". $_; }; }

    Hope this helps!

    Alakaboo

      Thats totally what I need to do problem is I am so new to perl I am not sure where to do it. I posted the subroutine I am working on to my scratchpad, basically I want to have it break out of that subroutine, the previous coder was much better at perl than I am and has left the company, I understand the qq^ is to output the xml and I think the ^ (caret, means match from first character preceding qq^to itself so its like the endpoint?) anyways I am not sure how to get it to not display. I guess I could setup a switch with completely different modules, based on the other product thats a tremendous amount of work though when all I really want to do is display on the left hand menu a (trying to get to this site click here) A link to a userguide, and a link to some demos, and possibly a help tab to display the help ( I do want it to do the nifty toc thing). Alakaboo, you will totally be my hero if you can help me figure this out, I have been working on it for a week and a half and feel like I am no closer to a resolution than when I began.
Re: CASE statement in Perl?
by merlyn (Sage) on Oct 23, 2000 at 19:45 UTC