2016-04-08 69 views
-2

需要計算字符串中「$ 0.00」的數量。我正在使用:

my $zeroDollarCount = ("\Q$menu\E" =~ tr/\$0\.00//); 

但它不起作用。問題是$標誌正在拋出正則表達式。如果我只想計算$的數目,但無法找到$0.00,則它可以工作。

這是如何重複的?您的解決方案沒有解決美元符號,這對我來說是一個問題。

+0

$是扔掉這個。你的鏈接沒有解決這個問題。 –

+1

其實它確實如此。但我仍然認爲這不是重複。我發佈了一個解釋你做錯了什麼的答案。 – simbabque

+0

我無法讓它工作,它已經嘗試了3天。 –

回答

2

您正在使用音譯運算符tr///。這與模式沒有任何關係。您需要代替匹配運算符m//。並且因爲您希望它找到該模式的所有發生,請使用/g修飾符。

my $count =() = $menu =~ m/\$0\.00/g; 

如果我們運行這個程序,輸出爲。

use strict; 
use warnings; 

my $menu = '$0.00 and $0.00'; 
my $count =() = $menu =~ m/\$0\.00/g; 

print $count; 

現在讓我們來看看發生了什麼。首先,比賽的模式。

/\$0\.00/ 

這是相當直接的。有一個字面$,我們需要用反斜槓\逃脫。零後面跟着一個文字點.,我們再次需要轉義,因爲它與$一樣,它在正則表達式中有特殊的含義。

my $count =() = $menu =~ m/\$0\.00/g; 

這整條線看起來很奇怪。我們可以將其分解成幾行以使其更具可讀性。

my @matches = ($menu =~ m/\$0\.00/g); 
my $count = scalar @matches; 

我們需要對正則表達式匹配的/g開關,使其符合所有出現。在列表上下文中,匹配操作會返回所有匹配項(這將是字符串"$0.00"多次)。因爲我們需要計數,我們然後將其強制爲scalar上下文,這給了我們元素的數量。這可以通過上面的成語縮寫爲一行。