Поиск от последнего совпадения

Проблема

Требуется возобновить поиск с того места, где было найдено последнее совпадение.
Такая возможность пригодится при многократном извлечении фрагментов данных из строки.

Решение

Воспользуйтесь комбинацией модификатора /g, метасимвола \G и функции pos.

Комментарий

При наличии модификатора /g механизм поиска запоминает текущую позицию в строке. При следующем поиске с /g совпадения ищутся, начиная с сохраненной позиции. Это позволяет создать цикл while для извлечения необходимой информации из строки:
while (/(\d+)/g) {
  print "Found $1\n";
}
Присутствие \G в шаблоне привязывает поиск к концу предыдущего совпадения. Например, если число хранится в строке с начальными пробелами, заменам каждого пробела нулем может выполняться так:
$n = "  49 here";
$n =~ s/\G /0/g;
print $n;
00049 here
\G часто применяется в циклах while. Например, в следующем примере анализируется список чисел, разделенных запятыми:
while (/\G,?(\d+)/g) {
  print "Found number $1\n";
}
Если поиск закончился неудачей (например, если в последнем примере кончились числа), сохраненная позиция по умолчанию перемещается в начало строки. Если это нежелательно (например, требуется продолжить поиски с текущей позиции, но с другим шаблоном), воспользуйтесь модификатором /с в сочетании с /g:
$_ = "The year 1752 lost 10 days on the 3rd of September";
while (/(\d+)/gc) {
  print "Found number $1\n";
}
if  (/\G(\S+)/g)  {
print "Found $1 after the last number. \n";
}
Found number 1752
Found number 10
Found number 3
Found rd after the last number.
Как видите, при последовательном применении шаблонов можно изменять позицию начала поиска с помощью модификатора /g. Позиция последнего совпадения связывается со скалярной величиной, в которой происходит поиск, а не с шаблоном. Позиция не копируется вместе со строкой и не сохраняется оператором local.
Позиция последнего совпадения читается и задается функцией роs. Аргументом функции является строка, для которой читается или задается позиция последпего совпадения. Если аргумент не указан, роs работает с переменной $_:
print "The position in \$a is ", pos($a);
pos($a) = 30;
print "The position in \$_ is ", pos;
pos = 30;

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: