模式匹配(例如/ file01中的4947000219)&用每个文件中的加号替换该数字

时间:2014-12-13 22:22:42

标签: perl

搜索模式(例如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"

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>;