Представим, что у нас есть масив @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 будет вызвана для каждого значени всего один раз.
Что это дает?
Пример 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;
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");
}
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`