суббота, 21 ноября 2009 г.

Удобства perl 5.10 или Modern::Perl

Как известно в perl 5.10 появилось много всяких вкусностей:
все новые операторы доступны по-умолчанию
Пример 1:
$a = 0 unless defined $a; #раньше 
$a //= 0;
 # perl 5.10
Пример 2:
Допустим у нас есть массив 
@types = qw/type1 type2 type3/;
и необходимо проверить наличие в нем некого элемента
if (grep {$a eq $_} @types ) {}
  # раньше
if ($a ~~ @types ) {}  #  perl 5.10  (самый быстрый способ для поиска элемента в массиве)

Так же появились новые конструкции и функции - state, given/when, say. Но они доступны после use feature ':5.10';
Решение:
use Modern::Perl;
Написав это, Вы получите use strict, use warnings, use feature ':5.10' и mro c3; 

среда, 11 ноября 2009 г.

Правильное использование временной переменной в цикле foreach


Классический перловый foreach цикл:

Вариант 1:
foreach my $element ( @list ) {
    #some code    
}

Вариант 2:
my $element;
foreach $element ( @list ) {
    #some code    
}

Сравнение:
Большинство, не задумываясь, используют первый вариант... и это правильно :). Но есть "программисты-оптимизаторы", которые используют второй вариант, аргументируя это тем, что он "быстрее" (забивая на то, что они засоряют пространство имен родительского блока). Не слушайте их!!! Первый вариант на 40% быстрее!!! (в атаче бенчмарк; хотя, естественно, чистое время перебора элементов может занимать меньше 1% времени обработки элементов )
Многих этот факт может удивить но все объясняется следующим образом: перл просто не использут предварительно  объявленую вами переменную и объявляет свою с таким же именем.

Попробуйте сами:
my $element = "NOT_USED";
foreach $element ( 1..2 ) {
    #some code
}
print $element; #выведет "NOT_USED";