2010-04-13 65 views
5

什麼是我有時會發現自己寫

s/(something)// ; 
    my $x = $1 ; 

然後我意識到,如果s///失敗$1可能從以前的比賽攜帶超過價值在Perl 從替代拿起匹配變量的最徹底的方法。所以我試試

my $x = 'defaultvalue' ; 
    if (s/(something)//) 
    { 
    $x = $1 ; 
    } 

這是乾淨的做法嗎?

回答

2

正如其他人所指出的那樣,TIMTOWTDI。

我personnally包起來作爲一個單一的表達,從而不從點分散太多:

my $x = s/(something)// ? $1 : 'defaultvalue'; 
+0

3年後回到這個問題,研究了功能性局域網這種方法有其優點。 – justintime 2013-04-04 01:28:31

4

TMTOWTDI。

慣用的Perl通常所見可能不會停,如:

my $x='defaultvalue'; 

$x=$1 if (s/(something)//) ; 
+2

另外單曲/(...)// &&($ x = $ 1)','$ x = s /(...)//?$ 1:'defaultvalue''等 – mob 2010-04-13 22:10:02

+0

非常習慣的'$ x = $ defaultvalue除非(s /(something)/ $ x = $ 1/e)''這只是爲虐待者推薦;-) – dawg 2010-04-14 02:05:36

1

@mobrule中,你可以使用

s{(...)}{} && ($x=$1) 

評論指出,我會建議

s{(...)}{} and $x = $1; 

我用s{}{}因爲我討厭它Markdown標記//作爲評論P erl代碼。

and的優先級低於&&,從而可以刪除作業周圍的括號。

perldoc perlop

隨着更多可讀替代&&和用於控制流時||,Perl提供的andor操作符(見下文)。短路行爲是相同的。的優先級「和」和「或」要低得多,但是,這樣就可以在列表操作後安全使用它們,而不需要括號:

1

這是非常主觀的,最好的答案將在如何很大程度上取決於它符合你的編碼風格,但我會把我的帽子扔進戒指。

我與默認分配最喜歡的是三級運營商:

my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue'; 

雖然新的(當然,不是新的,5.10介紹了吧)「規定或」運算符可以減少在第三語句需要很多情況下。我一般用它作爲這樣的:

my $var = defined($candidate) ? $candidate : 'default'; 

但現在可以簡化爲:

my $var = $candidate // 'default'; 

my $var = 'default'; 
$var //= $candidate; 
+0

只要小心使用'//'運算符並試圖太鈍,你可能會得到:'$ x =(s /...//, $ 1)// $ defaultvalue'這是一個更可讀形式的$ x =(s /...//, $ 1)|| ($ defaultvalue)'雖然這在很多情況下都適用,但它並不測試匹配 - 它正在測試一個定義的$ 1。在單獨攔截的情況下罰款,如果在此測試中以前成功的比賽中輸了一場不成功的比賽,那麼會死亡。這就是爲什麼我喜歡更直接的'$ x = $ 1 if(s /...//)。'適用於每種情況和每個塊。 – dawg 2010-04-15 19:37:19

相關問題