суббота, 25 июля 2009 г.

Сортировка Шварца

Представим, что у нас есть масив @ar , нужно получить масив @ar_new отортировав масив @ar следующим образом :
@ar_new = sort { slow_sub ($a) <=> slow_sub($b) } @ar 
Все бы хорошо но для сортировки n елементов блок сравнения будет вызван примерно n log n раз, а каждое сравнение это двойной вызов slow_sub. И в данной ситуации сортировка Шварца все решает.

@ar_new = map  { $_->[0] } 
                       sort { $a->[1] <=> $b->[1] }  
          map  { [ $_, slow_sub($_) ] } @ar;
Теперь slow_sub будет вызвана для каждого значени всего один раз.

среда, 15 июля 2009 г.

При присвоении перл возвращает переменную (вернее - lvalue), а не ее значение

Что это дает?
Пример 1.
Можно сделать замену в скопированной переменной(сохранив при этом оригинальную)
(my $new_var = $original_var)  =~ s/pattern/replacement/;

Пример 2.
Запись вида :
$a += 2;
$a *= 3;
можно заменить на :
($a += 2) *= 3;
Пример 3.
Запись вида :

if ($x) {
    $a->{key} = 1;
}else{
    $b->{key} = 1;
}

Можно заменить на : ($x ? $a : $b)->{key} = 1

ЗЫ: с это особенностью нужно быть осторожным.
Например, код:  0 ? $a = 1 : $a = 2; print $a; # выведет 2(вроде правильно)
1 ? $a = 1 : $a = 2; print $a; # выведет тоже  2. Хотя это не самый лучший  пример, в данном случае можно (и нужно) было  бы записать $a = 1? 1: 2;

пятница, 10 июля 2009 г.

Вы знаете про стандартную перловую утилиту find2perl ?!

find2perl транслирует параметры команды  "find" в перловый код,  который использует стандартный модуль  File::Find
смотреть perldoc perlutils 

Пример:
find2perl . -user root -perm 4000 -print
выдаст следующий платформонезависимый код (функция wanted нас интересует больше всего )

#здесь было начало. выполнив пример можно увидеть весь код  ;)
sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);

    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    ($uid == $uid{'root'}) &&
    (($mode & 0777) == 04000) &&
    print("$name\n");
}

воскресенье, 5 июля 2009 г.

Просмотр исходного текста модуля установленого в систему

perldoc -m Module

Пример:
perldoc -m File::Path

Модуль открылся и нет подсветки синтаксиса - просто нажмите "v". Модуль переоткроется в вашем редакторе(переменная EDITOR, у меня, например, vim) со всеми выплывающими прелестями. (этот фокус работает, если вы используете less как стандартный пейджер)

Как узнать где находится модуль установленный в систему ?

perldoc -l Module

Пример 1:
perldoc -l File::Path
/usr/lib64/perl5/site_perl/5.8.8/File/Path.pm

Пример 2:
Открыть системный модуль в vim можно следующим образом: vim `perldoc -l File::Path`