我有一个包含近 1,200 个文件的目录。我需要依次遍历 perl 脚本中的每个文件来搜索和替换任何出现的 66 个字符串。因此,对于每个文件,我需要运行所有 66 个 s&r。我的替换字符串是泰语的,所以我不能使用 shell。它必须是 .pl 文件或类似文件,以便我可以使用 .pl 文件 use::utf8
。我只是不熟悉如何一一打开目录中的所有文件以对其执行操作。这是我的 s&r 的示例:
s/psa0*(\d+)/เพลงสดุดี\1/g;
谢谢你的帮助。
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_glob
因为glob
不会“正确”处理空格。它们实际上是同一个函数,但是函数的行为会根据它的调用方式而有所不同。
顺便说一句,\1
在替换表达式中使用(即在正则表达式之外)是没有意义的。\1
是一个正则表达式模式,意思是“匹配第一次捕获的内容”。所以
s/psa0*(\d+)/เพลงสดุดี\1/g;
应该
s/psa0*(\d+)/เพลงสดุดี$1/g;
以下是更快的替代方案:
s/psa0*(?=\d)/เพลงสดุดี/g;
以防万一将来有人可以使用它。这就是我实际所做的。
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;
};