2012-04-16 3 views
1

У меня есть каталог с почти 1,200 файлами. Мне нужно последовательно просматривать каждый файл в perl-скрипте для поиска и замены любых вхождений из 66 строк. Итак, для каждого файла мне нужно запустить все 66 s & r. Моя строка замены на тайском языке, поэтому я не могу использовать оболочку. Это должен быть файл .pl или аналогичный, чтобы я мог использоватьuse::utf8. Я просто не знаком с тем, как открывать все файлы в каталоге один за другим, чтобы выполнять действия над ними. Вот пример из моей s & г:perl поиск и замена скрипта для всех файлов в каталоге

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

Спасибо за любую помощь.

+0

Какая ОС у вас есть? Если какой-то тип * nix, то проще использовать что-то вроде 'for f in *; do perl_script -i "$ f"; done' – yazu

+0

Windows с клубничным Perl. – preahkumpii

ответ

1

См opendir/readdir/closedir для функций, которые могут перебрать все имена файлов в директории (так же, как вы будете использовать open/readline/close для перебора всех строк в файле).

Также см. Функцию glob, которая возвращает список имен файлов, соответствующих определенному шаблону.

+0

Функция glob была ключом. Я опубликую то, что я на самом деле сделал немного. – preahkumpii

1
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 «s bsd_glob так glob не будет обрабатывать пробелы "правильно". Они на самом деле являются одной и той же функцией, но функция ведет себя по-разному в зависимости от того, как она называется.


Кстати, используя \1 в выражении замены (т.е. вне регулярного выражения) не имеет смысла. \1 - это шаблон регулярного выражения, который означает «совпадение с тем, что захватил первый захват». Так

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

должен быть

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

Ниже приводится быстрая альтернатива:

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

спасибо. на самом деле в финальном скрипте я изменил его на '$ 1', потому что perl жаловался. в любом случае это сработало. – preahkumpii

0

Только в случае, если кто-то может использовать его в будущем. Это то, что я на самом деле сделал.

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; 
}; 
Смежные вопросы