У меня есть несколько сотен PHP-скриптов, которые ожидают, что языковое поле будет содержать двухсимвольный идентификатор ISO 639-1.например, «en», который я сейчас хочу изменить для поддержки кодов языков, квалифицированных по коду страны, например «fr-CA».В каждом из этих сценариев есть следующий код:
case 'lang':
{ // language code
if (strlen($value) == 2)
$lang = strtolower($value);
break;
} // language code
, который я хочу изменить:
case 'lang':
{ // language code
if (strlen($value) >= 2)
$lang = strtolower(substr($value,0,2));
break;
} // language code
Поэтому я написал сценарий perl для запуска по всему дереву каталогов иизменить все соответствующие сценарии.Для тестирования я настроил сценарий на создание всех измененных сценариев в новой структуре каталогов:
use strict;
use warnings;
use 5.010;
use File::Find;
use File::Slurp;
my @content;
find( \&wanted, '/home/jcobban/public_html/');
exit;
sub wanted {
if (-f)
{
print "wanted: ", $File::Find::name, "\n";
my $odir = '/home/jcobban/testlang' . substr($File::Find::dir, 25);
if ((substr $odir, -1) ne "/"){
$odir = "$odir/";
}
if (! -d $odir){
mkdir $odir;
}
print "odir '$odir'\n";
my @lines = read_file($File::Find::name);
my $caselang = 0;
my $updated = 0;
foreach my $line (@lines){
if ($line =~ /\bcase\b/)
{
$caselang = $line =~ /\blang\b/i;
}
if ($line =~ /\bbreak\b/)
{
$caselang = 0;
}
if ($caselang)
{
print "old $line\n";
$line =~ s/ == 2/ >= 2/;
$line =~ s/strtolower(.value)/strtolower(substr(\$value,0,2))/;
$updated = 1;
print "new $line\n";
}
}
if ($updated)
{
# my $newfile = $File::Find::dir . "/" . $_;
my $newfile = $odir . $_;
print "alter \$lang to support ll-CC $newfile\n";
write_file($newfile, @lines);
}
else
{
print "did not find lang support in $_\n";
}
}
return;
}
Первое совпадение замены работает, чтобы изменить == на> =, но второе совпадение заменитьне изменяет никаких строк, и я не понимаю, хорошо.Я подумал, что, возможно, возникла проблема с соответствием "\ $", поэтому я заменил его на "."но все еще никакие линии не изменены.Я применил ту же команду к другим движкам регулярных выражений, и все они работали.Вывод для типичного файла:
wanted: /home/jcobban/public_html/videoTutorials.php
odir '/home/jcobban/testlang/'
old case 'lang':
new case 'lang':
old {
new {
old if (strlen($value) == 2)
new if (strlen($value) >= 2)
old $lang = strtolower($value);
new $lang = strtolower($value);
alter $lang to support ll-CC /home/jcobban/testlang/videoTutorials.php