2

1,200近くのファイルがあるディレクトリがあります。私はperlスクリプトの各ファイルを連続して調べて、66個の文字列の出現箇所を検索して置き換える必要があります。したがって、ファイルごとに、66個すべてのs&rを実行する必要があります。置換文字列はタイ語なので、シェルを使用できません。を使用できるように、.plファイルなどである必要があります use::utf8。ディレクトリ内のすべてのファイルを1つずつ開いて、それらに対してアクションを実行する方法に慣れていません。これが私のs&rのサンプルです:

s/psa0*(\d+)/เพลงสดุดี\1/g;

助けてくれてありがとう。

4

3 に答える 3

2
use utf8;
use strict;
use warnings;

use File::Glob qw( bsd_glob );

@ARGV = map bsd_glob($_), @ARGV;

while (<>) {    
   s/psa0*(?=\d)/เพลงสดุดี/g;
   print;
}

perl -i.bak script.pl *

スペースを「正しく」処理しないため、File::Globを使用しました。これらは実際には同じ関数ですが、関数の動作は呼び出し方法によって異なります。bsd_globglob


ちなみに、\1置換式で(つまり正規表現の外で)使用しても意味がありません。\1「最初のキャプチャがキャプチャしたものと一致する」ことを意味する正規表現パターンです。それで

s/psa0*(\d+)/เพลงสดุดี\1/g;

する必要があります

s/psa0*(\d+)/เพลงสดุดี$1/g;

以下は、より高速な代替手段です。

s/psa0*(?=\d)/เพลงสดุดี/g;
于 2012-04-16T10:00:16.237 に答える
1

opendirディレクトリ内のすべてのファイル名を反復処理できる関数については、 //を参照してくださいreaddir(ファイル内のすべての行を反復処理するために//をclosedir使用するのと同じように)。openreadlineclose

globあるパターンに一致するファイル名のリストを返す関数も参照してください。

于 2012-04-16T04:05:28.497 に答える
1

誰かが将来それを使用する可能性がある場合に備えて。これは私が実際にしたことです。

use warnings;
use strict;

use utf8;

my @files = glob ("*.html");

foreach $a (@files) {
   open IN, "$a" or die $!;
   open OUT, ">$a-" or die $!;
   binmode(IN, ":utf8");
   binmode(OUT, ":utf8");
   select (OUT);
   foreach (<IN>) {
      s/gen0*(\d+)/ปฐมกาล $1/;
      s/exo0*(\d+)/อพยพ $1/;
      s/lev0*(\d+)/เลวีนิติ $1/;
      s/num0*(\d+)/กันดารวิถี $1/;
      ...etc...
      print "$_";
   }
   close IN;
   close OUT;
};
于 2012-04-16T14:18:27.493 に答える