Perl删除第一次出现

时间:2012-07-16 14:40:54

标签: 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;

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

3 个答案:

答案 0 :(得分:7)

每次评估运算符时它都会替换第一个实例,并且您为每一行计算运算符,因此您将替换每行中的第一个实例。如果您使用/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

答案 1 :(得分:3)

这可以通过单线实现:

perl -0777 -pe 's/dog/ /' inputfile > outputfile

-0777开关将文件作为一行读取,这将使您的替换按预期工作。这个单线程相当于程序文件:

$/ = undef; 
$\ = undef;
while (<>) {
    s/dog/ /;
    print;
}

答案 2 :(得分:2)

while ( <> ) { 
    my $found = s/dog//;
    print;
    last if $found;
}
print while <>;