首页 > 解决方案 > 如何在 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 和一个标签。

标签: perlparsinghtml-parsinghtml-liststoken

解决方案


您的问题似乎与解析或 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');

推荐阅读