好的,所以我想删除第一次出现的字符串,比如说,“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来替换所有实例?为什么要替换我正在搜索的字符串的所有实例?这可能是一些我没有看到的简单错误。
答案 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 <>;