已經回答了,但有時候不太在意實施細節,您可以使用一些CPAN模塊來隱藏這些細節。
其中之一是美妙的Path::Tiny模塊。
你的代碼可能是因爲:
use 5.014; #strict + feature 'say' + ...
use warnings;
use Path::Tiny;
do_search($_) for @ARGV;
sub do_search {
my $curr_node = path(shift);
for my $node ($curr_node->children) {
say "Directory : $node" if -d $node;
say "Plain File : $node" if -f $node;
}
}
的children
方法自動排除.
和..
。
您還需要了解-f
測試僅適用於真實的files
。因此,上面的代碼排除了例如symlinks
(其指向真實文件)或FIFO
文件,等等......這樣的「文件」通常可以作爲普通文件打開和閱讀,因此,某些事件而不是-f
對於使用-e && ! -d
測試(例如存在,但不是目錄)。
該Path::Tiny
有這方面的一些方法,例如,你可以寫
for my $node ($curr_node->children) {
print "Directory : $node\n" if $node->is_dir;
print "File : $node\n" if $node->is_file;
}
is_file
方法通常是DWIM - 例如,是否:-e && ! -d
。
使用Path::Tiny
你也可以很容易地擴展你的函數使用iterator
方法走路整個樹:
use 5.014;
use warnings;
use Path::Tiny;
do_search($_) for @ARGV;
sub do_search {
#maybe you need some error-checking here for the existence of the argument or like...
my $iterator = path(shift)->iterator({recurse => 1});
while(my $node = $iterator->()) {
say "Directory : ", $node->absolute if $node->is_dir;
say "File : ", $node->absolute if $node->is_file;
}
}
上面打印的所有文件和目錄的類型從給定的參數遞歸下降...
等等...... Path::Tiny真的值得安裝。
謝謝您給出的解決方案。第一個解決了我的問題:) –