如何在 Perl 中不给出文件名的情况下解析文件?

How can I Parser file without giving file name in Perl?

提问人:Jack 提问时间:3/28/2019 最后编辑:Jack 更新时间:3/28/2019 访问量:76

问:

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

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;
}

在文件夹中,我有 3 个 HTML 文件,2 个文件夹。www

my @indexFiles= "www/I.html"在这一行中,我传递特定的路径名和文件。我不想传递这个名字。取而代之的是,它会自动选择。

例如:当我运行我的程序时。它应该是 Parse all the file。 我给出特定的文件名,然后它将找到 img 和一个标签。perl c.pl wwwI.html

perl 解析 html-parsing html-lists 令牌

评论

2赞 ikegami 3/28/2019
不清楚你在问什么
0赞 Håkon Hægland 3/28/2019
您似乎正在尝试将文件名提供给 .请澄清你想做什么?为什么要在没有文件名的情况下调用它?HTML::TokeParser
0赞 Jack 3/28/2019
@HåkonH我想要,因为在另一个文件夹中,无论.html文件是什么,我的程序都应该运行。对于该文件夹。
2赞 ikegami 3/28/2019
所以你的问题与解析或HTML::TokeParser无关,实际上是关于确定路径是否引用目录,并在引用目录时获取目录中的文件列表?如果我是对的,你能编辑你的帖子来问你的实际问题吗?
1赞 simbabque 3/28/2019
您需要编写代码来确定它是被赋予了文件名还是目录名,然后采取相应的措施。如果是目录,请找到所有 HTML 文件,然后对其进行处理。如果是文件,则仅处理该文件。正如 ikegami 所说,这与你实际如何处理这些文件的问题无关。

答:

1赞 ikegami 3/28/2019 #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');