【问题标题】:How can I Parser file without giving file name in Perl?如何在 Perl 中不提供文件名的情况下解析文件?
【发布时间】:2019-08-18 08:31:51
【问题描述】:

当我当时运行程序时,我只给出一个目录名,我希望目录中的所有文件都被解析?这是我的代码

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 提供文件名。请澄清您要做什么?为什么要在没有文件名的情况下调用它?
  • @HåkonHægland 我想要,因为在另一个文件夹中,无论有什么 .html 文件,我的程序都应该运行。为那个文件夹。
  • 所以你的问题与解析或 HTML::TokeParser 无关,实际上是关于确定路径是否引用目录,如果它获取目录中的文件列表引用目录?如果我是正确的,您能否编辑您的帖子以提出您的实际问题?
  • 您需要编写代码来确定它是否被赋予了文件名或目录名,然后采取相应的行动。如果是目录,则查找所有 HTML 文件,然后处理它们。如果是文件,则只处理该文件。正如 ikegami 所说,这与您实际处理这些文件的问题无关。

标签: perl parsing html-parsing html-lists token


【解决方案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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多