В последнее время у меня зримо изменился подход к написанию программ на Перле. Здесь чувствуется рука Москвы Хаскела.
Вместо традиционного:
# loading
if (open(FILE, ") {
chomp;
my ($url, $title) = split("\t");
$titles{$url} = $title;
}
close(FILE);
} else {
die "Can't open file: $!";
}
# do something
# saving
if (open(FILE, ">:encoding(utf-8)", $ofile)) {
foreach (keys %titles) {
print FILE "$_\t$titles{$_}\n";
}
} else {
die "Can't write file: $!";
}
Мне гораздо больше нравится писать нечто вроде:
# loading
open(FILE, ";
close(FILE);
# do something
# saving
open(FILE, ">:encoding(utf-8)", $ofile) || die "Can't write file: $!";
print FILE
join "\n",
map { join "\t", ($_, $titles{$_} || '') }
keys %titles;
close(FILE);
Да ещё и внутри 'do something' вместо циклов для обработки зафигачить какую-нибудь цепочку типа:
# filtering
my %seen = ();
my @urls =
grep { ! $seen{$_}++ } # filter uniq
map { s#^
http://##; $_ } # cut http prefix from url
keys %titles;
&do_something_good foreach @urls;
И
Schwartzian transform ещё тоже рулит. А главное, мне реально так нравится. Явные циклы и ветвления не нужны, когда это же можно сказать более естественным образом.
Всё-таки уважаю подход создателей Перла про
There's more than one way to do it.