2013-02-06 234 views
0

我仍然是perl noob。我得到一個字符串,可以是man_1,m​​an_2,woman1,woman2等。(沒有逗號,只有一個字符串作爲函數的輸入)。從字符串中提取子串

我需要在if語句中檢查man_或woman作爲子字符串,以確保提取合適的數字並添加一些偏移量。

我可以提取如下

$num =~ s/\D//g 
if (<need the substring extracted> == "man_") 
    $offset = 100; 
else if (<need the substring extracted> == "woman") 
    $offset = 10; 

return $num + $offset; 

數量現在我該怎樣提取子。我看了substr,它需要偏移量,而不是。無法弄清楚。感謝幫助

+0

的數字可以一路到1024的字符串傳遞給工作就像一個魅力的功能 –

回答

0

解決方案:

if ($num =~ m{^man_(\d+)$}) { 
    return 100 + $1; 
} elsif ($num =~ m{^woman(\d+)$}) { 
    return 10 + $1; 
} else { 
    die "Bad input: $num\n"; 
} 

在您的例子有兩個問題:

  1. S/\ d // g^- 將刪除該字符,但一個接一個,而不是所有\ D字符的大塊。因此,沒有變量是「man_」
  2. 要從正則表達式中獲取數據,您應該使用分組parens,如s /(\ D)//
  3. 要獲取所有字符,應該使用*或+運算符,如:s /(\ D +)//
  4. 它更好地匹配而不修改,因爲它可以更好地處理畸形數據的邊緣情況。
+0

。謝謝 –

0

depesz有一個很好的解決方案。下面是另一個:

my %offsets = (
    'man_' => 100, 
    'woman' => 10, 
); 

my ($prefix, $num) = $str =~ /^(\D+)(\d+)\z/ 
    or die; 
my $offset = $offsets{$prefix} 
    or die; 
return $num + $offset; 
0

另一種選擇:

return $2 + ($1 eq 'man_' ? 100 : 10) 
    if $num =~ /^(man_|woman)(\d+)\z/; 

die;