perl - 如何在 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;
}
在www
文件夹中,我有 3 个 HTML 文件,2 个文件夹。
my @indexFiles= "www/I.html"
在这一行中,我传递了特定的路径名和文件。我不想传递这个名字。取而代之的是,它将自动选择。
例如:当我运行我的程序时perl c.pl www
。它应该是解析所有文件。我给出具体的文件名I.html
,然后它会找到 img 和一个标签。
解决方案
您的问题似乎与解析或 HTML::TokeParser; 没有任何关系;它似乎是关于确定路径是否引用目录,如果它引用目录,则获取目录中的文件列表。
在最低级别,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 - 上的 HTML 滚动条
- apache-nifi - 等待两个csv文件到达,在nifi中同时输入两个csv文件到api
- javascript - 显示这个标记?当我提交登录表单时在我的网址中
- surveyjs - 在 SurveyJS 中完成调查的自定义“呈现”显示值
- sql - 蟾蜍甲骨文 10.5
- python - 在 python 中使用 Facebook Marketing API 为自定义受众批量上传 csv 文件
- html - 如何添加一个
- vuejs2 - Vue composition API value set, but still null in catch
- pandas - 过滤 Pandas DataFrame 列错误:传递的项目数错误 4,位置暗示 1
- c# - 如何区分取自 textBox1.Text 的键用作修饰符和 RegisterHotKey 的键?