本貼對三種遍歷資料夾方法比較。
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,那麼我們需要將 轉義,即 或者直接使用單引...