Чтобы доказать смысл eval
, а также из любопытства, я провел несколько тестов с кодом ОП против подхода $regex{$1}
против подхода eval
.
Прежде всего, тамкажется, мало смысла в том, чтобы собрать все возможные токены в (token|token|...)
выражении соответствия.Perl должен проверить против всех лексем сразу - это спорно, насколько более эффективным, чем это просто проверка каждого маркера в то время, и делать замену с закодированного значением
Во-вторых, делает $regex{$1}
средства.ключ хеш-карты извлекается при каждом совпадении.
В любом случае, вот некоторые числа (запустил это на клубничном 5.12, с 4 МБ файлом из 100К строк):
-
$regex{$1}
заход на посадку занимает 6 секунд (5 секунд с / ход вместо / g) - заход на посадку
tie
занимает 10 секунд - заход на посадку OPзанимает чуть менее 1 секунды (с / go вместо / g)
- Подход
eval
занимает менее 1 секунды (быстрее, чем код OP)
Это подход eval
:
$regex{foo} = "bar";
$regex{hello} = "world";
$regex{python} = "perl";
$regex{bartender} = "barista";
$s = <<HEADER;
\$start = time;
open(F, "myfile.txt");
while (<F>) {
HEADER
foreach $key (keys %regex) {
$s .= "s/$key/$regex{$key}\/go;\n"
}
$s .= <<FOOTER;
print \$_;
}
close(F);
print STDERR "Elapsed time (eval.pl): " . (time - \$start) . "\r\n";
FOOTER
eval $s;