in reply to Re^5: Control Structures
in thread Control Structures

Well, that's what I get for posting before the Mt. Dew has kicked in -- I completely missed what the closure was doing. (and of course, I didn't actually run it).

But well, that being said, there are cases where switch is useful. Yes, it can be done through work arounds, but if you're going to do this sort of thing often enough, it's annoying to have to do extra work when other languages have it built in, and you know that the one part you're dealing may be easier to implement in some other language.

I know there are modules, and plenty of different ways to handle switch-like syntax in Perl, possibly because your dispatch tables would be tuned differently depending on your exact needs. Sometimes, I just want something to work, no matter how inefficiently, for those times when my time is more valuable than the execution time of the program --

I don't want to research which module best fits my needs, and doesn't have known issues, then go and download the module through CPAN, only to find that it has some other dependancy (that I'm going to need to install on whatever other machines I may try to run this script on, etc.). Modules may be great, but there's always the assumption that something has been more thoroughly tested if it's packaged with the main distribution, or if it's a builtin function, and it's going to be less of a headache to maintain in a multiple system environment.

Replies are listed 'Best First'.
Re^7: Control Structures
by Roy Johnson (Monsignor) on May 10, 2005 at 16:00 UTC
    My point was, if you're going to be doing this sort of thing often enough, pick an implementation you like, put it in your own personal library, and use it.

    There's only one module that I know of that does switch/case, and it's a source filter, and doesn't do C-style fall-through. Like Perl6, it behaves like multiple ifs, trying every condition, even after one has matched.

    Maybe I'll make a module for C-style case, and it will make it into the core module set (hey, a guy can dream), but until then, there is nothing wrong with having your own library of tools that you find handy. Yeah, it's not as nice as having them built-in, but you can't have everything (even in Perl 6!)

    Here's a more streamlined version of my case factory. I don't know whether it makes the short-circuiting more clear.

    sub case_new { my $matched = 0; return sub { my $check = shift; return $matched ||= (ref $check eq 'Regexp' and /$check/) || $_ eq $check; } }

    Caution: Contents may have been coded under pressure.