0

我想创建单个文件夹中某些 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 文件要阅读。谢谢!

4

2 回答 2

1

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

use File::Basename;
$album_name = basename($pwd);
于 2013-06-13T15:40:43.010 回答
1

您应该使用处理所有混乱递归的File::FindorFile::Find::Rule模块。XML 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";
}
于 2013-06-13T15:26:29.810 回答