Как получить perl для замены strtolower ($ value) на strtolower (substr ($ value, 0, 2)) - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть несколько сотен 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

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Просто хочу показать несколько хаков, может быть, вам будет интересно:

s'strtolower\(\K\$value'substr($value,0,2)'

Мы можем подставить подстановку с тем, что захотим:

s/foo/bar/;
s'foo'bar';
s(foo)(bar);

Если мы выберем одинарные кавычкипеременные не будут интерполированы, но мы все равно должны избегать знака доллара на стороне шаблона, потому что re-engine будет обрабатывать его как "конец строки".

\K Держите материал слева от \K

больше информации в perldoc perlre

0 голосов
/ 23 ноября 2018

Я, очевидно, тратил слишком много времени на использование VIM.Проблема с моим кодом заключалась в том, что мне нужно было убрать круглые скобки, чтобы они не интерпретировались как подшаблон.

    $line       =~ s/strtolower\(.value\)/strtolower(substr(\$value,0,2))/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...