2011-11-22 59 views
1

在Haskell(F#,ocaml的,和其他人)匹配,我可以这样做:模式在Perl ALA哈斯克尔

sign x | x > 0  = 1 
     | x == 0  = 0 
     | x < 0  = -1 

,它计算给定整数的符号。

这可以简洁地表达某些逻辑流程;我在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"); 
} 

这感觉无表情的和丑陋的。

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

+0

我不知道你在找什么。除了“if”和“return”之外的东西?用这个可以做的事情不多。使用散列? – TLP

回答

7

这里有一个其他可行的方法,这仍然是一个有点罗嗦,但也许反映了流更好。 (在“Perl最佳实践”一书中,作者建议大多避免使用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"); 
} 
+0

我没有想到这一点。 :)这看起来最接近我正在寻找的东西。谢谢! –

3

对于它的价值,Perl的5.10或更高版本为您提供:

given

...这将使:

... 
use feature qw(switch say); 
use Carp; 
sub frobnicator { 
    my $frob = shift; 
    given ($frob) { 
     when ('Foomaticator') { 
      return q(foo); 
     } 
     when ('Barmaticator') { 
      return q(bar); 
     } 
     default { 
      croak(qq(Unable to frob legit value: $frob received)); 
     } 
    } 
} 
+0

正则表达式匹配与字符串“eq”不同。你的意思是'when('Foomaticator')'。 – cjm

+3

您需要调用'use feature'switch''或'use feature':5.10''来启用此功能。 – stevenl

+0

我编辑过这个以反映OP对平等的请求,除了显示特征杂注要求之外,不是正则表达式匹配。点好了。 – JRFerguson

4

您可以使用条件运算符:

sub frobnicator { 
    my $frob = shift; 
    return $frob eq 'Foomaticator' ? 'foo' : 
     $frob eq 'Barmaticator' ? 'bar' : 
     croak("Unable to frob legit value: $frob received"); 
} 

它将您的原始示例变成类似于:

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

哪,你知道的,就是有点难看,但它得到跨:-)点

4
sub sign { 
    my $x = shift; 
    return $x <=> 0; 
} 

表现?如果你知道"spaceship" operator是干什么的,是的。如果不是,不是那么多。我想说,一段perl代码对你的感受完全取决于你对perl的熟悉程度。

我必须说我不知道​​你在做什么。对我来说,你的例子中的代码非常清晰,而且毫不丑陋。人们总是在Perl的替代品,所以怎么样:

sub frobnicator 
{ 
    my $frob = shift; 
    my %frobs = (
     Foomaticator => "foo", 
     Barmaticator => "bar", 
    ); 
    return $frobs{$frob} // # If $frob is a defined key, return it 
     croak("Unable to frob legit value: $frob received"); 
} 

稍微不太精确,但也许更友好的较旧的perl版本使用||代替//

+0

'子标志{$ _ [0] <=> 0}':) –

+0

@EricStrom是的,这就是我一开始就有的。 =) – TLP