我有一个包含近1,200个文件的目录。我需要在perl脚本中连续遍历每个文件,以搜索和替换66个字符串的任何出现。因此,对于每个文件,我需要运行所有66 s& r。 我的替换字符串是泰语,所以我不能使用shell。它必须是.pl文件或类似文件,以便我可以使用 use::utf8
。我不熟悉如何逐个打开目录中的所有文件来对它们执行操作。这是我的s& r的样本:
s/psa0*(\d+)/เพลงสดุดี\1/g;
感谢您的帮助。
答案 0 :(得分: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_glob
,因为glob
无法“正确”处理空格。它们实际上是相同的函数,但函数的行为根据它的调用方式而有所不同。
顺便说一句,在替换表达式中使用\1
(即在正则表达式之外)是没有意义的。 \1
是一种正则表达式模式,意味着“匹配捕获的第一次捕获”。所以
s/psa0*(\d+)/เพลงสดุดี\1/g;
应该是
s/psa0*(\d+)/เพลงสดุดี$1/g;
以下是更快的替代方案:
s/psa0*(?=\d)/เพลงสดุดี/g;
答案 1 :(得分:1)
有关可以遍历目录中所有文件名的函数,请参阅opendir
/ readdir
/ closedir
(非常类似于使用open
/ readline
/ close
遍历文件中的所有行。)
另请参阅glob
函数,该函数返回与某些模式匹配的文件名列表。
答案 2 :(得分: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;
};