2

我有一个包含近 1,200 个文件的目录。我需要依次遍历 perl 脚本中的每个文件来搜索和替换任何出现的 66 个字符串。因此,对于每个文件,我需要运行所有 66 个 s&r。我的替换字符串是泰语的,所以我不能使用 shell。它必须是 .pl 文件或类似文件,以便我可以使用 .pl 文件 use::utf8。我只是不熟悉如何一一打开目录中的所有文件以对其执行操作。这是我的 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::Globbsd_glob因为glob不会“正确”处理空格。它们实际上是同一个函数,但是函数的行为会根据它的调用方式而有所不同。


顺便说一句,\1在替换表达式中使用(即在正则表达式之外)是没有意义的。\1是一个正则表达式模式,意思是“匹配第一次捕获的内容”。所以

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

应该

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

以下是更快的替代方案:

s/psa0*(?=\d)/เพลงสดุดี/g;
于 2012-04-16T10:00:16.237 回答
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 回答
1

有关可以遍历目录中所有文件名的函数,请参见opendir// readdir(就像您使用//遍历文件中的所有行一样)。closediropenreadlineclose

另请参阅该glob函数,该函数返回与某些模式匹配的文件名列表。

于 2012-04-16T04:05:28.497 回答