2011-11-22 88 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