perl遍歷檔案

2021-04-13 11:30:16 字數 2926 閱讀 1142

本貼對三種遍歷資料夾方法比較。

1. 使用file::find;

2. 遞迴遍歷。(遍歷函式為lsr)

3. 使用佇列或棧遍歷。(遍歷函式為lsr_s)

1.use file::find

[copy to clipboard]

[ - ]

code:

#!/usr/bin/perl -w #

# file: find.pl

# author:  路小佳

# license: gpl-2

use strict;

use warnings;

use file::find;

my ($size, $dircnt, $filecnt) = (0, 0, 0);

sub process

else }

find(/&process, '.');

print "$filecnt files, $dircnt directory. $size bytes./n";

2. lsr遞迴遍歷

[copy to clipboard]

[ - ]

code:

#!/usr/bin/perl -w #

# file: lsr.pl

# author: 路小佳

# license: gpl-2

use strict;

use warnings;

sub lsr($)

foreach (readdir(dh))

my $file = $cwd.'/'.$_;

if (!-l $file && -d _)

process($file, $cwd); }

closedir(dh); }

my ($size, $dircnt, $filecnt) = (0, 0, 0);

sub process($$)

else }

lsr('.');

print "$filecnt files, $dircnt directory. $size bytes./n";

3. lsr_s棧遍歷

[copy to clipboard]

[ - ]

code:

#!/usr/bin/perl -w #

# file: lsr_s.pl

# author: 路小佳

# license: gpl-2

use strict;

use warnings;

sub lsr_s($)

foreach (readdir(dh))

$file = $dir.$_;         

if (!-l $file && -d _)

process($file, $dir); }

closedir(dh); }

}my ($size, $dircnt, $filecnt) = (0, 0, 0);

sub process($$)

else }

lsr_s('.');

print "$filecnt files, $dircnt directory. $size bytes./n";

對我的硬碟/dev/hda6的測試結果。

1: file::find

[copy to clipboard]

[ - ]

code:

26881 files, 1603 directory. 9052479946 bytes.

real    0m9.140s

user    0m3.124s

sys     0m5.811s

2: lsr

[copy to clipboard]

[ - ]

code:

26881 files, 1603 directory. 9052479946 bytes.

real    0m8.266s

user    0m2.686s

sys     0m5.405s

3: lsr_s

[copy to clipboard]

[ - ]

code:

26881 files, 1603 directory. 9052479946 bytes.

real    0m6.532s

user    0m2.124s

sys     0m3.952s

測試時考慮到cache所以要多測幾次取平均, 也不要同時列印檔案名, 因為控制台是慢裝置, 會形成瓶頸。

lsr_s之所以用棧而不是佇列來遍歷,是因為perl的push shift pop操作是基於陣列的, push pop這樣成對操作可能有優化。記憶體和cpu占用大小順序也是1>2>3.

[copy to clipboard]

[ - ]

code:

cpu load          memory

use file::find             97%               4540k

lsr                        95%               3760k

lsr_s                      95%               3590k

結論: 強烈推薦使用lsr_s來遍歷資料夾。

**********===再羅嗦幾句********************==

從執行效率上來看,find.pl比lsr.pl的差距主要在user上, 原因是file::find模組選項較多, 條件判斷費時較多,而lsr_s.pl比lsr.pl在作系統呼叫用時較少, 是因為遞迴時程式還在儲存原有的檔案控制代碼和函式恢復現場的資訊, 所以sys費時較多。 所以lsr_s在sys與user上同時勝出是不無道理的。 

Perl 遍歷雜湊

我們在遍歷二維或多維的雜湊時,可以採用遞迴的方法.1.首先檢視每個value的值型別,如hash,array,還是簡單的標量 2.如果value的值型別是hash,則遞迴直到找到相應的array 或者標量 3.如果value的值型別是array,則通過迴圈列印出各個元素 4.如果value的值型別是...

Perl遍歷目錄

環境為windos,需要注意的兩點 1 預設activeperl下的採用的編碼是gbk,所以需要將字串轉為gbk才不會顯示亂碼 2 遍歷檔案目錄時,需要排除特殊的目錄.和.完整的 usr bin perl 2 use strict 3 use warnings 4 use encode qw fro...

PERL陣列的遍歷

在雙引號內可以使用 直接輸出陣列 rocks qw flinstone slate rubblke print quarrz rocks limtstone n print fred rocks.com.cn 如果我們真的想要輸出 21136.com.cn,那麼我們需要將 轉義,即 或者直接使用單引...