Как сопоставить 2 шаблона в одной строке - PullRequest
1 голос
/ 30 июня 2010

У меня следующий код Java

fun(GUIBundle.getString("Key1"), GUIBundle.getString("Key2"));

Я использую Perl для анализа исходного кода, чтобы определить, находятся ли «Key1» и «Key2» в $ gui_bundle.

while (my $line = <FILE>) {
    $line_number++;
    if ($line =~ /^#/) {
        next;
    }
    chomp $line;

    if ($line =~ /GUIBundle\.getString\("([^"]+)"\)/) {
        my $key = $1;
        if (not $gui_bundle{$key}) {
            print "WARNING : key '$key' not found ($name $line_number)\n";
        }
    }
}

Однако для способа написания кода я могу проверить только «Key1». Как я могу также проверить «Key2»?

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

Добавьте модификатор g и поместите его в цикл while:

while ($line =~ /GUIBundle\.getString\("([^"]+)"\)/g) { ...
1 голос
/ 30 июня 2010

Просто используйте модификатор /g для соответствия регулярному выражению, в контексте списка:

@matches = $line =~ /GUIBundle\.getString\("([^"]+)"\)/g;

Учитывая вашу строку примера, @matches будет содержать строки: 'Key1' и 'Key2'.

0 голосов
/ 30 июня 2010

Замените конструкцию if на while и, используя модификатор глобального сопоставления, /g:

while (my $line = <FILE>) {

    $line_number++;

    next if $line =~ /^#/;
    chomp $line;

    while ($line =~ /GUIBundle\.getString\("([^"]+)"\)/g) { #"

        my $key = $1;
        warn "key '$key' not found ($name $line_number)" unless $gui_bundle{$key};
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...