Perl脚本卡住了

时间:2018-10-14 01:53:32

标签: regex perl

我有一个文件夹,其中包含需要删除而不删除正在运行的文件的旧文件。

我在linux中有一个命令列出包含运行文件名的运行文件。

{"xxxxxx","235235235.filename",{xxx},xxxx,xxxx,xxxx}

我只需要235235235.filename和一个脚本来与linux目录中的文件进行比较并删除不匹配的文件,但是该目录中也有xxxxxxxxxxx_235235235.filename s。

这是我现在的位置:

#!/usr/bin/perl -w

use strict;
use warnings;
my $dir = "****";
opendir(DIR, $dir) or die "Could not open $dir: $!\n";
my @allfiles = readdir DIR;
close DIR;

foreach my $oldfiles(@allfiles) {
$oldfiles =~ s/^(?>\N*?_)((?<field3>[^\n\r.]*?)\.str)$/$+{field3}/img;

#print "$oldfiles\n";
}

my $cmd ="****";
#my $cmd ="ls";
my @runEvents = `$cmd`;
chomp @runEvents;
print "done.";
foreach my $running(@runEvents) {
$running =~ s/(?<field2>[0-9a-z]{4}_8[0-9a-z]{2}_[0-9a-z]{2}[a-z][0-9a-z]0[0-9]\.str|PICO_8D[0-9]_2{2}6[0-9]-1{2}\.str)|\{"PID 8[0-9a-z]{2}","/$+{field2}/ig;


        print "$running\n";
}

运行最后一个正则表达式时,我得到

  

在第24行的替换迭代器中使用未初始化的值$ +(“ field2”}。

有人能指出我的正确方向吗?

1 个答案:

答案 0 :(得分:1)

对于查找正则表达式失败的地方,我发现Regexp::Debugger非常有用。它使您可以单步浏览正则表达式,以便查看正则表达式对于输入数据而言不够通用的地方。

“运行事件”程序中的输入数据是诊断正则表达式为什么失败的最有趣的方法,但是如果有的话,将其放入小型测试程序中会使事情变得非常简单:

#!perl
use strict;
use warnings;
use Regexp::Debugger;

while(<DATA>) {
    s/(?:(?<field2>[0-9A-Za-z]{4}_8[0-9A-Za-z]{2}_[0-9A-Za-z]{2}[A-Za-z][0-9A-Za-z]0[0-9]\.[Ss][Tt][Rr]|[Pp][Ii][Cc][Oo]_8[Dd][0-9]_2{2}6[0-9]-1{2}\.[Ss][Tt][Rr])|\{"[Pp][Ii][Dd] 8[0-9A-Za-z]{2}","|[",0-9ginru{}]{34,$
};

__DATA__
... the data that your shell script outputs ...

此外,您的正则表达式似乎已被删除,您能否以正确的正则表达式更新您的问题?