Perl 删除第一次出现

标签 perl replace

好的,所以我想删除文件中第一次出现的字符串,比方说“dog”,并且只删除第一次出现的地方。所以如果文件读取:

The dog was happy.
The dog liked to run.

输出将是

The was happy.
The dog liked to run.

我有以下代码:

#!/usr/local/bin/perl

use warnings;
use strict;

my $file = $ARGV[0];
my $out = $ARGV[1];

open (IN, "<$file");
open (OUT, ">$out");
while(<IN>){
  s/dog/ /;
  print OUT $_;
}

close IN;
close OUT;

它起作用了,但它不是只重新定位第一个实例,而是替换单词的所有实例。我以为我必须使用全局修饰符 g 来使其替换所有实例?为什么要替换我正在搜索的字符串的所有实例?这可能是一些我没有看到的简单错误。

最佳答案

它会在您每次评估运算符时替换第一个实例,并且您为每一行评估运算符,因此您替换了每一行中的第一个实例。如果您使用 /g,您将替换每一行中的所有实例。

my $seen;
while (<>) {
   ++$seen if !$seen && s/dog//;
   print;
}

或者作为单行:

perl -pe'++$seen if !$seen && s/dog//;' infile >outfile

您可以重新添加文件句柄,但以上内容接受更标准和更灵活的用法。要获得与您的代码相同的效果,您只需使用

script.pl infile >outfile

代替

script.pl infile outfile

关于Perl 删除第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11506660/

相关文章:

vba - Trim() 不适用于表格

perl - 如何使用 Perl 哈希存储库存?

c# - 如果关键字之前存在数字,则删除子字符串

python - 在 Python 3 中替换字符串中的 unicode 字符

perl - Data::Dumper::简单用法

python - str.replace(..).replace(..) 令人作呕的是 Python 中的标准习语吗?

javascript - 如果在数字之间用javascript替换逗号

linux - 尝试根据每条记录的内容将一个非常大的文件拆分成多个较小的文件 (perl/linux)

perl - post-for/if 语法是什么?

perl - 我可以为Perl中的所有信号设置一个信号处理程序吗?