-4

我有大约 200 个文件位于同一目录中,所有这些文件都包含我需要使用 RegExp 匹配的特定内容,并将所有匹配的内容保存到单个数组中或将它们存储在新文件中。

使用 notepad++ 正则表达式引擎时,我执行以下操作来定位模式:

<div class="opacity description">(.*)</div>

所以这就是我正在寻找的模式。

这就是我打开并列出目录中所有文件的方式。

my $d = shift;

opendir(D, "details/") || die "Can't opedir $d: $!\n";
my @list = readdir(D);
closedir(D);

foreach my $f (@list) {
  print "\$f = $f\n";
}
4

2 回答 2

4
use strict;
use warnings;

use HTML::TreeBuilder::XPath;

my ($dir) = @ARGV;

my @files = glob "$dir/*";

for my $file (@files) {
  my $tree = HTML::TreeBuilder::XPath->new_from_file($file);
  my @opacity = $tree->findnodes_as_strings('//div[@class="opacity description"]');
  print "\n$file\n";
  print "  $_\n" for @opacity;
}
于 2013-02-01T13:35:59.777 回答
1

你可以用 shell 做到这一点:

如果您有最近的 xarg,它将并行运行 grep (-p) 并且每个进程 (-n) 几个文件。这很好,如果你有大量的文件。

ls -1 | xargs -p3 -n 5 -i grep -HP '<div class="opacity description">(.*)</div>' {}

或使用 perl

foreach my $f (@list) {
  local $/='';  
  print "\$f = $f\n";
  open(FILE,'<',$f) or die $f;
  my $c = <FILE>;
  close(FILE);
  if ($c =~ m!<div class="opacity description">(.*)</div>!){
    print "Found in $f\n";
  }
}

对于处理 HTML 文件,使用理解 HTML 并且可以在 DOM 树中行走的模块要安全得多。

于 2013-02-01T14:11:53.220 回答