什麼是我有時會發現自己寫
s/(something)// ;
my $x = $1 ;
然後我意識到,如果s///
失敗$1
可能從以前的比賽攜帶超過價值在Perl 從替代拿起匹配變量的最徹底的方法。所以我試試
my $x = 'defaultvalue' ;
if (s/(something)//)
{
$x = $1 ;
}
這是乾淨的做法嗎?
什麼是我有時會發現自己寫
s/(something)// ;
my $x = $1 ;
然後我意識到,如果s///
失敗$1
可能從以前的比賽攜帶超過價值在Perl 從替代拿起匹配變量的最徹底的方法。所以我試試
my $x = 'defaultvalue' ;
if (s/(something)//)
{
$x = $1 ;
}
這是乾淨的做法嗎?
正如其他人所指出的那樣,TIMTOWTDI。
我personnally包起來作爲一個單一的表達,從而不從點分散太多:
my $x = s/(something)// ? $1 : 'defaultvalue';
@mobrule中,你可以使用
s{(...)}{} && ($x=$1)
評論指出,我會建議
s{(...)}{} and $x = $1;
我用s{}{}
因爲我討厭它Markdown標記//
作爲評論P erl代碼。
and
的優先級低於&&
,從而可以刪除作業周圍的括號。
隨着更多可讀替代
&&
和用於控制流時||
,Perl提供的and
和or
操作符(見下文)。短路行爲是相同的。的優先級「和」和「或」要低得多,但是,這樣就可以在列表操作後安全使用它們,而不需要括號:
這是非常主觀的,最好的答案將在如何很大程度上取決於它符合你的編碼風格,但我會把我的帽子扔進戒指。
我與默認分配最喜歡的是三級運營商:
my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue';
雖然新的(當然,不是新的,5.10介紹了吧)「規定或」運算符可以減少在第三語句需要很多情況下。我一般用它作爲這樣的:
my $var = defined($candidate) ? $candidate : 'default';
但現在可以簡化爲:
my $var = $candidate // 'default';
或
my $var = 'default';
$var //= $candidate;
只要小心使用'//'運算符並試圖太鈍,你可能會得到:'$ x =(s /...//, $ 1)// $ defaultvalue'這是一個更可讀形式的$ x =(s /...//, $ 1)|| ($ defaultvalue)'雖然這在很多情況下都適用,但它並不測試匹配 - 它正在測試一個定義的$ 1。在單獨攔截的情況下罰款,如果在此測試中以前成功的比賽中輸了一場不成功的比賽,那麼會死亡。這就是爲什麼我喜歡更直接的'$ x = $ 1 if(s /...//)。'適用於每種情況和每個塊。 – dawg 2010-04-15 19:37:19
3年後回到這個問題,研究了功能性局域網這種方法有其優點。 – justintime 2013-04-04 01:28:31