Perl ala Haskell中的模式匹配

Pau*_*han 1 perl coding-style pattern-matching

在Haskell(F#,Ocaml等)中,我可以这样做:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1
Run Code Online (Sandbox Code Playgroud)

它计算给定整数的符号.

这可以简明扼要地表达某些逻辑流程; 我在Perl中遇到过其中一个流.

现在我正在做的是

sub frobnicator
{
   my $frob = shift;
   return "foo" if $frob eq "Foomaticator";
   return "bar" if $frob eq "Barmaticator";
   croak("Unable to frob legit value: $frob received");
}
Run Code Online (Sandbox Code Playgroud)

这让人感到无比和丑陋.

这段代码必须在Perl 5.8.8上运行,但我当然也对更现代的技术感兴趣.

ste*_*enl 7

这是另一种可能的方法,它仍然有点罗嗦,但也许更好地反映了流程.(在Perl最佳实践一书中,作者建议大多避免使用postfix形式,if因为你需要一直扫描到右边才能理解发生了什么.)如果有助于突出显示条件,你可以添加括号.

sub sign
{
    my $x = shift;
    $x  > 0  and return  1;
    $x == 0  and return  0;
    $x  < 0  and return -1;
}

sub frobnicator
{
    my $frob = shift;

    $frob eq "Foomaticator" and return "foo";
    $frob eq "Barmaticator" and return "bar";

    croak("Unable to frob legit value: $frob received");
}
Run Code Online (Sandbox Code Playgroud)