提问人:Jack 提问时间:3/28/2019 最后编辑:Jack 更新时间:3/28/2019 访问量:76
如何在 Perl 中不给出文件名的情况下解析文件?
How can I Parser file without giving file name in Perl?
问:
当我运行程序时,我只给出一个目录名称,我希望目录中的所有文件都被解析?这是我的代码
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;
}
在文件夹中,我有 3 个 HTML 文件,2 个文件夹。www
my @indexFiles= "www/I.html"
在这一行中,我传递特定的路径名和文件。我不想传递这个名字。取而代之的是,它会自动选择。
例如:当我运行我的程序时。它应该是 Parse all the file。
我给出特定的文件名,然后它将找到 img 和一个标签。perl c.pl www
I.html
答:
1赞
ikegami
3/28/2019
#1
您的问题似乎与解析或 HTML::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$qfn\E/*"));
}
elsif ($qfn =~ /\.html\z/) {
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$qfn\E/*.html"));
}
elsif ($qfn =~ /\.html\z/) {
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');
评论
HTML::TokeParser