提取文件名

sti*_*o68 3 regex perl

我正在编写一个脚本,它从目录中获取一个文件列表,打开每个文件,然后搜索包含扩展名为.zip的文件名的行.然后我想从行中删除文件名.这是我的代码:

foreach (@fnames) {
    chomp ($_);
    open FILE, '<', "$_";
    @archives = grep { /.+?\.zip/ } <FILE>;

    foreach (@archives) {
        if ($_ =~ /("|>)(.+?)("|<)/) { push @files, $2; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从中提取数据的文件将包含双引号或尖括号之间的.zip文件名.此代码没有返回任何内容,但我知道文件名存在.如果我在终端上做grep我可以看到所有这些,但是Perl中的grep并没有给我任何东西.有任何想法吗?

TLP*_*TLP 6

可能出错了:

  • @fnames 是空的,因为你没有显示代码中的一些错误.
  • open FILE, ...失败,但由于你没有检查它的返回值open,它会无声地失败,因此你不知道它.使用open ... or die $!
  • 例如ZIP,输入中有大写字母,并且不要/i在grep中使用ignore case选项.顺便说一句,.+?在开始时是相当无用的,除非你期望不需要的字符串开头 .zip(即它只检查之前至少有一个字符).
  • 第二个循环中的if语句只会抓取第一个匹配.

也:

  • 你应该使用词法文件句柄open.
  • 如果您还没有这样做,您应该使用严格和警告.
  • my @archives并且my @files在适当的词汇范围内将有助于确保您获得并保留您想要的数据.
  • $_ =~ /.../可以简单地编写/.../以获得更好的可读性(IMO).
  • 你(实际上)不需要转换变量.
  • ("|>)是一种多余的说法[">].
  • grep是冗余处理.你可以简单地做:

while (<FILE>) {
      push @files, /[">](.*\.zip)["<]/ig;
}
Run Code Online (Sandbox Code Playgroud)

简而言之:

my @files;
foreach my $file (@fnames) {
    chomp $file;
    open my $fh, '<', $file or die $!;
    while (<$fh>) {
        push @files, /[">](.*\.zip)["<]/ig;
    }
}
print "File names found: @files\n";
Run Code Online (Sandbox Code Playgroud)