четверг, 18 марта 2010 г.

Никогда не пишите так m/$var/ :)

Не многие в курсе, но такая запись m/$var/  чревата сложно находимыми багами. Сразу оговорюсь, что это актуально если $var может быть пустой.


Пример 1
my $a = "text"; 
my $b = "text2"; 
print 1 if $b =~ /text2/; 
print 2 if $a =~ //;
# В результате будет напечатано 1;



Пример 2
my $a = "text"; 
my $b = "text2"; 
print 1 if $b =~ /text3/; 
print 2 if $a =~ //;
# В результате будет напечатано 2;


Perl вместо пустого регекспа всегда вставляет предыдущий успешно совпавший регексп. Все это описано в perldoc perlre :). 

Бойтесь пустых регекспов и пишите, например так - m/(?:$var)/

2 коммент.:

Анонимный комментирует...

Я что-то не понимаю, а какой у нас есть успешно совпавший регексп во втором случае (когда выводится 2)?

koorchik комментирует...

В первом примере вместо пустого регекспа перл подставляет /text2/;
А во втором примере первый регексп не совпал, значит в строке print 2 if $a =~ //; пустой регексп и остается пустым, а пустой регексп всегда совпадает с любой строкой

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)