好的,所以我想删除文件中第一次出现的字符串,比方说“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/