2012-10-30 27 views
1

我想計算一個文本字符串的出現次數。下面如何計算在Perl中出現文本字符串的次數?

我的Perl代碼打印語句(文本字符串)時,發現某些類型的文件,我需要計數它打印字符串的時間。

elsif ($elt =~ /DELETE_.+\.XML/) { 
    print " <-- Delete XMLs !!"; 
} 

我只是想學習Perl和我不是一個程序員!所以請解釋任何答案。

我不想插入,排序或合併,算了算。

+0

你想統計相同字符串中的匹配嗎?或多個不同的字符串。 – TLP

回答

2
elsif ($elt =~ /DELETE_.+.XML/) { 
    print " <-- Delete XMLs !!"; 
    $count++; # Count number of times string is printed 
} 
0

下應該算匹配的行:

use strict; 
use warnings; 

my $count = 0; 

for (<>) { 
    $count++ if /line-matches/; 
} 

print "count: $count\n"; 

如果您放置在一個文件count.pl,那麼你就可以運行它,它是:

perl count.pl file1 file2 file3 ... 

它應該如果需要在管道中使用它也可以工作:

ls *.XML | perl count.pl 
4

如果要算的目錄中有一個名稱,將匹配/DELETE_.+\.XML/的所有文件,我會做這樣的:

  1. 打開目錄。
    在Perl中,這是與

    opendir my $directory, "path/to/dir" or die "Error while opening: $!"; 
    

    完成之後,$directory是代表手柄此目錄的變量。

  2. 您可以在目錄中的所有文件。
    在Perl中,我們可以使用readdir功能:

    my @files = readdir $directory; 
    

    這讀取$directory的所有內容到一個數組稱爲@files

  3. 選擇該模式匹配的所有文件。
    在Perl中,您可以選擇滿足一定條件與grep元素:

    my @interesting_files = grep {/DELETE_.+\.XML/} @files; 
    # ^--output     ^--a condition--^ ^--source 
    

    我們括在大括號內的條件。它可以包含任意代碼,但我們只是在這裏放置一個正則表達式。 grep是一種數據過濾器。

  4. 我們指望在@interesting_files所有元素。
    Perl有背景的概念。有標量上下文列表上下文。函數和變量在每個函數中表現不同。如果在標量上下文中使用數組,它將返回該數組中的元素數。我們可以強制標量上下文中有scalar功能:

    my $count = scalar @interesting_files; 
    

總之,這種形式的代碼:

opendir my $directory, "path/to/dir" or die "Error while opening: $!"; 
my @files = readdir $directory; 
my @interesting_files = grep {/DELETE_.+\.XML/} @files; 
my $count = scalar @interesting_files; 

這可如果我們省略不必要的變量和使用減少到下面兩行隱含的上下文。

opendir my $directory, "path/to/dir" or die "Error while opening: $!"; 
my $count = grep {/DELETE_.+\.XML/} readdir $directory; 

但是請注意,$count,直到我們離開封閉塊({...})纔可以看到。如果您需要此塊以外的$count,您必須在聲明my在最外面的範圍它使用它。或者,您根本不使用my,但這有缺點。


真正優雅的解決方案使用glob功能:

my $count =()= glob "DELETE_*.XML"; 

這個抽象了手動目錄打開和使用的通配語法從Unix外殼熟悉。這些是而不是傳統正則表達式! =()=僞操作符可以被讀爲計數的。它在右側強加列表上下文,但允許左側擁有標量上下文。

+1

'my $ count =()= $ str =〜/ DELETE _。+ \。XML/g;'會在這裏完成圖片。 – Zaid

相關問題