2017-09-22 43 views
1

我試圖在perl中使用正則表達式從字符串中提取文本和數字。這裏是我的代碼:使用正則表達式在Perl中應用過濾器

$line = "finish=100\n"; 
($var) = $line =~ /[a-z]+/; 
($val) = $line =~ /[0-9]+/; 

我預期的輸出是$ VAR = 「完成」 和$ VAL = 100。然而,當我運行的代碼是$ var = 1和$ VAL = 1

任何幫助將不勝感激!

回答

4

使用捕捉你的正則表達式括號內:

$line = "finish=100\n"; 
($var) = $line =~ /([a-z]+)/; 
($val) = $line =~ /([0-9]+)/; 
print "$var $val\n"; 

參考perlre

1

一個正則表達式匹配在列表環境(其中正則表達式不使用/g標誌)返回

  • 空列表如果失敗
  • 捕獲的子字符串列表($1, $2, ...),如果它成功和模式包含捕獲組
  • 列表1如果成功和模式沒有捕獲任何

你的正則表達式匹配,但它們不包含任何捕獲組,所以這是爲什麼你在$var$val得到1

如果添加捕獲組(/([a-z]+)/,/([0-9]+)/),則會得到匹配的子字符串。

注意,這可能是更容易只是做這一切在一次比賽:

my ($var, $val) = $line =~ /^([a-z]+)=([0-9]+)$/; 

這樣你也驗證輸入字符串具有預期的形式,而不是僅僅像"Cat o' 9 tails",其中(與您的原始正則表達式)將提取$var = "at"$val = "9"

0

你也能得到一個陣列的兩個值,可能與此:

$line = "finish=100\n"; 
@matches = $line =~ /(\w+)\W(\d+)/; 
print "$matches[0], $matches[1]";