我正在編寫一個腳本,通過我們龐大的Perl腳本目錄並檢查某些事情。現在,它需要兩種輸入:主目錄或單個文件。如果提供了單個文件,它將在該文件上運行主要功能。如果提供主目錄,它將在該目錄內的每個.pm和.pl上運行主函數(由於目錄遍歷的遞歸性質)。Perl子目錄遍歷
我該如何編寫它(或者什麼軟件包可能會有所幫助) - 以便我還可以輸入七個子目錄中的一個,它只會遍歷該子目錄(而不是整個目錄)?
我正在編寫一個腳本,通過我們龐大的Perl腳本目錄並檢查某些事情。現在,它需要兩種輸入:主目錄或單個文件。如果提供了單個文件,它將在該文件上運行主要功能。如果提供主目錄,它將在該目錄內的每個.pm和.pl上運行主函數(由於目錄遍歷的遞歸性質)。Perl子目錄遍歷
我該如何編寫它(或者什麼軟件包可能會有所幫助) - 以便我還可以輸入七個子目錄中的一個,它只會遍歷該子目錄(而不是整個目錄)?
一種方便的方法是使用優秀的Path::Class
module,更準確地說的Path::Class::Dir
的traverse()
方法。你可以控制從作爲第一個參數提供的回調函數中處理的內容到traverse()
。手冊頁有樣本片段。
當然,使用像opendir
這樣的內置插件是非常好的。
我剛剛轉向使用Path::Class
幾乎無處不在,因爲它有許多不錯的便利方法,只是感覺很好。請務必閱讀docs for Path::Class::File
以瞭解可用內容。真的99%的時間完成這項工作。
如果你確切地知道你想看看你可以使用glob("$dir/*/*/*.txt")
例如獲得過.txt
文件中給出的$dir
的第三級我實在看不出之間的處理有什麼區別目錄及子目錄兩個目錄參數。當然,使用File :: Find只會在兩種情況下做正確的事情。
事情是這樣的......
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my $input = shift;
if (-f $input) {
# Handle a single file
handle_a_file($input);
} else {
# Handler a directory
handle_a_directory($input);
}
sub handle_a_file {
my $file = shift;
# Do whatever you need to with a single file
}
sub handle_a_directory {
my $dir = shift;
find(\&do this, $dir);
}
sub do_this {
return unless -f;
return unless /\.p[ml]$/;
handle_a_file($File::Find::name);
}
那麼'opendir'和'readdir'和'grep'爲所需的目錄呢? – smocking