好的,所以我想删除第一次出现的字符串,比如说,"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来替换所有实例?为什么要替换我正在搜索的字符串的所有实例?这可能是一些我没有看到的简单错误.
每次评估运算符时,它都会替换第一个实例,并且您为每一行评估运算符,因此您将替换每行中的第一个实例.如果你使用过/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)
| 归档时间: |
|
| 查看次数: |
2877 次 |
| 最近记录: |