【问题标题】:Replace every nth Occurrence in a Perl Script替换 Perl 脚本中的每 n 次出现
【发布时间】:2013-12-21 02:27:10
【问题描述】:

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

Replace every Nth occurrence

这是我目前的脚本:

use strict;
use warnings;

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

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

我尝试了没有打印命令的脚本,但没有任何反应。如何让此脚本运行并执行每三个“no_access”的替换。

【问题讨论】:

  • 问题:你怎么称呼这个脚本?我没有看到文件名参数。此外,脚本不会就地更改文件,即使它在文件上循环。
  • 我今天刚开始使用 Perl。我正在解决这个问题:stackoverflow.com/questions/10153302/…
  • 我从命令行调用这样的脚本:perl Script.pl TextFile.txt

标签: regex perl


【解决方案1】:

这是另一个选择:

use strict;
use warnings;

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

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

用法:perl script.pl inFile [&gt;outFile]

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

希望这会有所帮助!

【讨论】:

  • 不确定我是否理解如何翻译“除非 ++$i % $n”。这是否意味着除非没有剩余,否则执行替换?
  • @DrewRush - 模式是do x unless y (is true)。因此,只要++$i % $n 评估为Trues/no_access/read/ 就不会完成。 Perl 实际上将上述unless 语句评估为(++$i % $n) or s/no_access/read/。由于使用了or,如果++$i % $n 不为零,则永远不会评估(执行)s/no_access/read/。这称为short circuiting。
  • @gatinueta - 根据 OP 的规范,每一行 一个事件。
  • @Kenosis:正确。我删除了我的评论。
【解决方案2】:

您的代码几乎是正确的,只需将变量声明移到 while 循环之外,将 print 移到里面:

use strict;
use warnings;

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

然后它从标准输入读取并打印到标准输出,根据需要更改每 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);

【讨论】:

  • 将结果打印到命令行。如何获得结果以在文本文件中进行就地替换?
  • 没有“就地”替换。您可以编写新文件,然后通过多种方式将其名称更改为旧名称;或者您可以读取整个文件,然后再次打开它进行写入。我将更新我的答案以说明如何。
猜你喜欢
  • 2011-08-17
  • 2018-09-08
  • 2021-08-31
  • 2018-08-11
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多