Здравствуйте, Аноним, Вы писали:
А>Есть текст, в котором нужно выделить все совпадения с вот таким шаблоном "aaa(.+?)bbb(.+?)ccc" и распечатать $1/$2 соответственно. Так вот почему если сделать так:
А>А> @Links = $TMP=~/aaa(.+?)bbb(.+?)ccc/g;
А> join("\n",@Links);
А>
А>то всё нормально, а если сразу, без перехода к массиву, т.е. вот так:
А>А> foreach ($TMP=~/aaa(.+?)bbb(.+?)ccc/g)
А> {
А> print $1."\n".$2."\n";
А> }
А>
А>то распечатается одно и тоже (последнее) совпадение с шаблоном столько раз, сколько совпадение найдено.
А>Я понимаю, что в случае foreach, видимо, каждый раз выполняется сопоставление и печатается одно и тоже, но не пойму логику работы перла в случае перехода к массиву. Ведь модификатор /g есть и там и там..
Второй вариант(скалярный контекст) надо писать так:
while ($TMP=~/aaa(.+?)bbb(.+?)ccc/g)
{
print $1."\n".$2."\n";
}
В случае foreach (...) мы вроде ожидаем контекст массива. Поэтому мы сразу получаем массив и естественно что в $1 и $2 результаты последнего совпадения — их мы и печатаем каждый раз.