替换Perl脚本中的每个第n次出现

时间:2013-12-21 02:27:10

标签: regex perl

我有10行的文本文件。每行都有单词no_access,只有no_access。我找到了一个网站,它具有替换每个第n个字符串的语法。当我尝试将其放入脚本时,它会吐出错误。

Replace every Nth occurrence

这是我到目前为止的脚本:

use strict;
use warnings;

while (<>) {
my $count = 0; 
s/no_access/(++$count % 3 == 0)?"read":$&/ge;
}
print;

但是,我收到错误:在打印中使用未初始化的值$ _。

我在没有print命令的情况下尝试了脚本,但没有任何反应。如何让这个脚本运行并执行每三个“no_access”的替换。

2 个答案:

答案 0 :(得分:4)

这是另一种选择:

use strict;
use warnings;

my $i = 0;
my $n = 3;

while (<>) {
    s/no_access/read/ if !( ++$i % $n );
    print;
}

用法:perl script.pl inFile [>outFile]

最后一个可选参数将输出定向到文件。

希望这有帮助!

答案 1 :(得分:3)

您的代码几乎是正确的,只需将变量声明移到while循环之外,然后打印内部:

use strict;
use warnings;

my $count = 0;
while (<>) {
        s/no_access/(++$count % 3 == 0)?"read":$&/ge;
        print;
}

然后从stdin读取并打印到stdout,根据需要每隔3次更改一次。

如果您想读取文件,更改其内容,然后再次编写,您的代码可能如下所示:

use strict;
use warnings;

my $file = $ARGV[0];
die "usage: $0 <filename>" unless defined $file;
open(IN, "<$file") or die "Can't read $file: $!";
my $count = 0;
my $out = "";
while (<IN>) {
        s/no_access/(++$count % 3 == 0)?"read":$&/ge;
        $out .= $_;
}
close(IN);
open(OUT, ">$file") or die "Can't write $file: $!";
print OUT $out;
close(OUT);