Помогите понять глобальный флаг в Perl - PullRequest
9 голосов
/ 07 августа 2011

Насколько я знаю, в perl global флаг '/ g' означает, что поиск заменит / вернет все совпадения по всей строке. Но я не могу понять, как он реагирует на глобальные переменные при сопоставлении, может кто-нибудь объяснить, почему существует разница между выходными данными этих двух примеров программ:

Версия 1:

my $text = 'This is sample float value 3.2 ';

getFloat();
getFloat();

sub getFloat(){
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){
        print "matched> $1$2$3 ";
    }
}

Выход: соответствует> 3,2 соответствует> 3,2

Версия 2: (с глобальным флагом)

my $text = 'This is sample float value 3.2 ';

getFloat();
getFloat();

sub getFloat(){
    if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){
        print "matched> $1$2$3 ";
    }
}

Выход: соответствует> 3,2

Как видно из выходных данных, при глобальном сопоставлении флагов происходит только один раз. Может кто-нибудь объяснить это поведение.

Ответы [ 2 ]

10 голосов
/ 07 августа 2011

С модификатором g строка запоминает место последнего совпадения, поэтому вы можете запросить совпадение с g в цикле while и найти все совпадения.

Без g вы начинаете каждый раз заново и всегда находите первое совпадение.

В вашем случае с g вы подходили 3,2 в первый раз, но во второй раз, когда вы пытались сопоставить, больше не былосовпадения.

Без g вы можете позвонить getFloat() миллион раз, и вы всегда найдете первое совпадение.

8 голосов
/ 07 августа 2011

При использовании в контексте списка, /g заставляет =~ возвращать все совпадения.При использовании в скалярном контексте /g заставляет =~ возвращать одно совпадение при каждом его использовании, а затем завершается ошибкой (возвращает undef), когда совпадений больше нет, перед повторным запуском в начале строки.(Вы можете предотвратить это с помощью /gc.) Вы также можете использовать функцию pos($text), чтобы найти или установить позицию, с которой начинается матч.

Без /g, =~ всегда возвращаетодин и тот же матч каждый раз.Это эквивалентно установке pos($text) на undef каждый раз.(В контексте списка =~ вместо этого возвращает список снимков.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...