搜索模式(例如file01中的/ 4947000219)&用每个文件中的一个增量替换该数字。(例如/ 4947000219,文件02中为/ 4947000220,文件03中为/ 4947000221 ..)与20140924105028相同的尝试
#!/usr/bin/perl -w
use strict;
use warnings;
use 5.010;
use autodie;
use Time::Piece;
use Time::Seconds qw/ ONE_MINUTE /;
use constant DATE_FORMAT => '%Y%m%d%H%M%S';
my $n;
my $directory = "/home/e/Doc/AutoMation";
opendir(DIR, $directory) or die "couldn't open $directory: $!\n";
my @files = readdir DIR;
foreach (@files) {
open my $in_fh, '<', $_;
my @lines = $_;
close $in_fh;
++$n;
$lines[0] =~ s/\/4947000219/\K(4947000219+)/$1 + $n / e;
$lines[1] =~ s{:20140924105028\K(\d+)}{
my $tp = Time::Piece->strptime($1, DATE_FORMAT);
($tp + ONE_MINUTE * 2 * $n)->strftime(DATE_FORMAT);
}e;
my $backup = "$_.backup";
unlink $backup if -f $backup;
rename $_, $backup;
open my $out_fh, '>', $_;
print $out_fh @lines;
close $out_fh;
}
closedir DIR;
获取错误消息:
Unrecognized escape \K passed through at /home/e/Doc/AutoMation line 27.
Scalar found where operator expected at /home/e/Doc/AutoMation.pl line 27, near "s/\/4947000219/\K(4947000219+)/$1"
syntax error at /home/e/Doc/AutoMation.pl line 27, near "s/\/4947000219/\K(4947000219+)/$1"
答案 0 :(得分:1)
此行中有语法错误:
$lines[0] =~ s/\/4947000219/\K(4947000219+)/$1+$n/e;
# ││ │└─────── Syntax error
# ││ └──────── End of substitution string
# │└─────────────────────── \K is regex only, warning
# └──────────────────────── Not escaped, end of regex
您还没有转义正则表达式中的所有/
。这就是您收到语法错误的原因。我建议你试着找一个你的正则表达式中没有出现的分隔符,如下所示:
$lines[0] =~ s~/4947000219/\K(4947000219+)~$1+$n~e
此外,你的正则表达式可能不会做你想要的。 +
之后的9
奇怪可疑。如果您的号码可能出现多次,我会把它移到parens之外(现在它只是量化9
)。
修改:此外,使用<$fh>
从文件句柄进行阅读,仅在while(<$fh>)
的特殊情况下,内容才会分配到$_
。因此,您的@lines
实例化应如下所示:
my @lines = <$in_fh>;