如何在不使用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所说,这与您实际如何处理这些文件的问题无关。