当我当时运行程序时,我只给出一个目录名称,我希望解析目录中的所有文件?这是我的代码
my @indexFiles= "www/I.html";
my @rdata = readFile("@indexFiles");
sub readFile{
my $somefile = $_[0];
my @links = ($somefile);
my $p = HTML::TokeParser->new($somefile) || die "Can't open: $!";
while (my $token = $p->get_tag("img","a")){
my $currentlink = $token->[1]{href} || $token->[1]{src};
my $finalLink= $directory."/".$currentlink ;
if($currentlink =~ /.html$/){
my @data = readFile($finalLink);
push @links,@data;
} else{
push @links,$finalLink;
}
}
return @links;
}
在www
文件夹中,我有 3 个 HTML 文件,2 个文件夹。
my @indexFiles= "www/I.html"
在此行中,我传递特定的路径名和文件。我不想传递这个名字。取而代之的是,它将自动选择。
例如:当我运行我的程序时perl c.pl www
.它应该是解析所有文件。我给出特定的文件名,I.html
之后它将找到img和一个标签。
您的问题似乎与解析或 HTML::TokeParser(英语:TokeParser( 无关; 它似乎是关于确定路径是否引用目录,以及获取目录中的文件列表(如果它引用了目录(。
stat
和 -d
(组合或独立(可用于测试路径是否引用目录。
在最低级别,opendir
+ readdir
+ closedir
用于读取目录。内置glob
和众多模块提供了执行此操作的替代方法。
递归搜索:
sub process {
for my $qfn (@_) {
stat($qfn)
or die("Can't stat "$qfn": $!n");
if (-d _) {
process(glob("Q$qfnE/*"));
}
elsif ($qfn =~ /.htmlz/) {
process_html_file($qfn);
}
}
}
process('www');
非递归搜索:
sub process {
for my $qfn (@_) {
stat($qfn)
or die("Can't stat "$qfn": $!n");
if (-d _) {
process_html_file(glob("Q$qfnE/*.html"));
}
elsif ($qfn =~ /.htmlz/) {
process_html_file($qfn);
}
}
}
process('www');
或者,您可以使用File::Find::Rule。
递归搜索:
use File::Find::Rule qw( );
process_html_file($_)
for File::Find::Rule->name('*.html')->file->in('www');
非递归搜索:
use File::Find::Rule qw( );
process_html_file($_)
for File::Find::Rule->maxdepth(1)->name('*.html')->file->in('www');