пятница, 1 июля 2011 г.

Тест на понимание Perl: Вопрос 5

Вопрос
Что выведет следующий код?
$MODE = 'debug';

sub is_debug { $MODE =~ /debug/gi ? 1:0 }

print 5 if is_debug();
print 6 if is_debug();
print 7 if is_debug();
Ответ: 57


Пояснение
Вызов функции is_debug будет нам по очереди возвращать то 1, то 0. Это связано с тем, что мы используем регексп с модификатором "g" в скалярном контексте. В такой ситуации при удачном совпадении Perl запоминает позицию на которой остановился и в следующий раз продолжает поиск с нее.

Нужно такое поведение, для таких вот ситуаций:
$x = "cat dog house";
while ($x =~ /(\w+)/g) {
    print "Word is $1, ends at position ", pos $x, "\n";
}

Детали в perldoc perlretut