如何在不使用Perl提供文件名的情况下解析文件?
当我运行该程序时,我只给出一个目录名,我想解析目录中的所有文件?这是我的密码如何在不使用Perl提供文件名的情况下解析文件?,perl,parsing,html-parsing,html-lists,token,Perl,Parsing,Html Parsing,Html Lists,Token,当我运行该程序时,我只给出一个目录名,我想解析目录中的所有文件?这是我的密码 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 @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::Parser没有任何关系;它似乎是关于确定路径是否引用目录,以及如果路径引用目录,则获取目录中的文件列表
和(结合使用或独立使用)可用于测试路径是否引用目录
在最低级别,++用于读取目录。内置模块和众多模块提供了实现这一点的替代方法
递归搜索:
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');
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');
非递归搜索:
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');
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');
或者,您可以使用
递归搜索:
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');
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');
非递归搜索:
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');
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
提供一个文件名。请澄清你想做什么?你为什么要叫它没有文件名?@HåkonHægland我想要,因为在另一个文件夹中,不管有什么.html文件,我的程序都应该运行。所以你的问题与解析或HTML::TokParser无关,实际上是关于确定路径是否引用目录,如果它引用目录,则获取目录中的文件列表?如果我是正确的,你能编辑你的帖子来问你的实际问题吗?你需要编写代码来确定它是被赋予了一个文件名还是一个目录名,然后采取相应的行动。如果它是一个目录,找到所有HTML文件,然后处理它们。如果是文件,只处理该文件。正如ikegami所说,这与您实际如何处理这些文件的问题无关。