Perl删除第一次出现

use*_*061 2 perl replace

好的,所以我想删除第一次出现的字符串,比如说,"dog",在文件中,只有第一次出现.所以如果文件是:

狗很高兴.
狗喜欢跑.

输出将是

很高兴.
狗喜欢跑.

我有以下代码:

#!/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;
Run Code Online (Sandbox Code Playgroud)

并且它可以工作,但它不是仅重新调整第一个实例,而是替换该单词的所有实例.我以为我必须使用全局修饰符g来替换所有实例?为什么要替换我正在搜索的字符串的所有实例?这可能是一些我没有看到的简单错误.

ike*_*ami 7

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

my $seen;
while (<>) {
   ++$seen if !$seen && s/dog//;
   print;
}
Run Code Online (Sandbox Code Playgroud)

或者作为一个单行:

perl -pe'++$seen if !$seen && s/dog//;' infile >outfile
Run Code Online (Sandbox Code Playgroud)

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

script.pl infile >outfile
Run Code Online (Sandbox Code Playgroud)

代替

script.pl infile outfile
Run Code Online (Sandbox Code Playgroud)