如何使用Perl列出多个XML文件中的某些模式

时间:2013-06-13 13:49:23

标签: xml regex perl automation

我想在单个文件夹中创建某些XML文件集内容中提到的* .ini扩展名的所有文件名列表。 它们都包含完整路径,但我只需要 Filename.ini

基本上它意味着打开所有xml文件,读取它,找到带有* .ini ext的所有文件名并打印出来。

我正在考虑关注perl代码:

#!/usr/bin/perl  
@files = <P:\TeamMembers\rsacek\_INI\*>;
foreach my $file (@fnames) {
    chomp $file;
    open my $fh, '<', $file or die $!;
    while (<$fh>) {
        push @files, /[">](.*\.ini)["<]/ig;
     }
}
print "File names found: @files\n";

有什么想法吗?我有大约30k的文件要读。 谢谢!

2 个答案:

答案 0 :(得分:1)

您应该在File::Find中使用File::Find::RuleXML Parser模块来处理所有混乱的递归。为什么重新发明轮子?

使用File::Find

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my @found;
find(\&wanted, 'P:/TeamMembers/rsacek/_INI');

foreach ( @found ) {
   print "$_\n";
}

sub wanted {
   return unless -f;
   open my $fh, '<', $File::Find::name or warn "failed $!" and return;
   while (<$fh>) {
      push @found, $1 if /[">](.*?\.ini)["<]/ig;
   }
   close $fh;
}

但也许对于另一种方法,这应该有用。

我对返回的非文件的项使用grep(主要是列表过滤功能)。 map用于获取完整路径,而不是继续循环并查找它。

#!/usr/bin/perl

use strict;
use warnings;

my $dir = 'P:/TeamMembers/rsacek/_INI';

opendir my $dh, $dir or die "failed opening '$dir' $!";

my @found;
foreach my $f ( map { "$dir/$_" } grep { -f "$dir/$_" } readdir $dh ) {
   open my $fh, '<', $f or die "failed opening '$f' $!";
   while ( <$fh> ) {
       push @found, $1 if /[">](.*?\.ini)["<]/ig;
   } 
   close $fh;
}
closedir $dh;

foreach ( @found ) {
    print "$_\n";
}

答案 1 :(得分:1)

要获取文件名部分,可以使用“basename”。例如:

use File::Basename;
$album_name = basename($pwd);