2011-07-02 38 views
1

比方說我這樣做:Perl的正則表達式默認爲不匹配

my ($a,$b,$let) = $version =~ m/^(\d+)\.(\d+)\.?([A-Za-z])?$/; 

所以這將匹配例如:1.3A,1.3,... 我想爲$讓一個默認值如果再讓不可用,可以說,默認爲0。 所以1.3我將獲得: $ A = 1 $ b = 3 $讓= 0

這可能嗎? (從正則表達式它的自我,而無需使用額外的語句)

感謝,

+1

不是真的。如果你把它改成'([A-Za-z]?)',你會得到''''作爲默認值,但就是這樣。 – Kobi

+0

我可以問你爲什麼需要這樣做嗎? – NorthGuard

+6

'$ let = 0除非定義$ let'? – TLP

回答

2

這將工作 - 更新使用按位或代替三元運算符。

my ($a,$b,$let) = ($version =~ m/^(\d+)\.(\d+)\.?([A-Za-z])?$/) 
      && ($1,$2,$3 || 0); 

下面是測試腳本

&t("1.3"); 
&t("1.3a"); 
&t("1.3.a"); 

sub t { 
$version = shift; 
my ($a,$b,$let) = ($version =~ m/^(\d+)\.(\d+)\.?([A-Za-z])?$/) 
       && ($1,$2,$3 || 0); 
print "\n result $a.$b.$let"; 
} 

輸出使用三元操作

result 1.3.0 
result 1.3.a 
result 1.3.a 

原來的解決方案也適用

my ($a,$b,$let) = ($version =~ m/^(\d+)\.(\d+)\.?([A-Za-z])?$/) 
      && (defined $3 ? ($1,$2,$3) : ($1,$2,0)); 
0

$let應該有undef默認值。如果需要,你可以測試一下。