2

さて、ファイル内の文字列の最初の出現、たとえば「犬」を削除し、最初の出現のみを削除したいと思います。したがって、ファイルが次のようになっている場合:

犬は幸せでした。
犬は走るのが好きだった。

出力は次のようになります

幸せでした。
犬は走るのが好きだった。

私は次のコードを持っています:

#!/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を使用する必要があると思いましたか?検索している文字列のすべてのインスタンスが置き換えられるのはなぜですか?それはおそらく私が見ていないいくつかの単純なエラーです。

4

3 に答える 3

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
于 2012-07-16T14:44:00.873 に答える
3

これは、ワンライナーで実現できます。

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

スイッチはファイルを1行として読み取ります。-0777これにより、置換が期待どおりに機能します。このワンライナーは、プログラムファイルと同等です。

$/ = undef; 
$\ = undef;
while (<>) {
    s/dog/ /;
    print;
}
于 2012-07-16T15:16:12.450 に答える
2
while ( <> ) { 
    my $found = s/dog//;
    print;
    last if $found;
}
print while <>;
于 2012-07-16T15:36:42.397 に答える