2016-02-25 35 views
0

在Perl的正則表達式,the documentation指定捕獲組的值,如果沒有匹配:指定字符串

...在標量上下文,$time =~ /(\d\d):(\d\d):(\d\d)/返回真 或假值。在列表環境,但是,它返回 匹配的值($1,$2,$3)

但它是如何,當你提供另一種選擇的清單 - 當沒有找到匹配 - TRUE或FALSE將甚至在列表上下文分配時?

作爲示例,我想將匹配的組分配給變量,如果找不到,請使用字符串值ALL。

my ($var) = $string =~ /myregex/ || 'ALL'; 

這可能嗎?那麼多個被捕獲的組呢?例如。

my ($var1, $var2) = $string =~ /(d.t)[^d]+(d.t)/ || 'dit', 'dat'; 

其中如果所述第一組不匹配,則使用'dit',如果沒有匹配的第二發現'dat'

+0

它有沒有成爲一個班輪? 'if'' else'並使用'$ 1'和'$ 2'可能會更具可讀性 – Recct

+0

@Recct它不必是 - 只要它有效。 –

+0

在'||'之後,如果左邊的所有內容都是false,即使您使用較弱的'或',假如正則表達式失敗仍然沒有任何事情發生在右邊。 – Recct

回答

1

對於第一個要求,你可以使用三元運算:

my $string = 'abded'; 
for my $f ('a' .. 'f') { 
    my ($v1) = $string =~ /($f)/ ? ($1) : ('ALL') ; 
    say "$f : $v1"; 
} 

輸出:

a : a 
b : b 
c : ALL 
d : d 
e : e 
f : ALL 
相關問題