В perl я читаю строку и пытаюсь заменить набор строк соответствующими выражениями, используя последовательность операторов if. Например:
my @shiftInstructions=("lsr", "lsl", "rol", "ror");
while (my $line = <>) {
if ($line =~ /\$sh/) {
my $r = int(rand(6));
$line =~ s/\$sh/$r/;
}
if ($line =~ /\$ish/) {
my $r = $shiftInstructions[rand(4)]
$line =~ s/\$ish/$r/;
}
}
Мне не нравится этот подход по ряду причин. Во-первых, это повторяется. Я должен сначала проверить, существует ли шаблон, а затем, если это так, выполнить функцию для генерации значения замены, а затем заменить. Таким образом, он является как многословным, так и медленным (2 поиска по регулярному выражению на шаблон, возможно, в конечном счете, десятки строк шаблона).
Я подумал о карте, где несколько кодов сопоставляются с соответствующим кодом для выполнения.
Я могу представить себе отображение на строку и затем использовать eval, но тогда я не могу проверить код, кроме как во время выполнения. Есть ли более чистый способ сделать это?
Я нашел опцию выполнения в регулярном выражении. Как насчет написания набора подпрограмм для обработки каждого регулярного выражения, а затем создания отображения:
my %regexMap = (
"\$fn", &foundFunc,
"\$hw", &hex8,
"\$hb", &hex2,
"\$sh", &rand6,
"\$ish", &shiftInst,
);
while (my $line = <>) {
$line =~ s/(\$fn|\$hw|\$hb|\$sh|\$ish|)/$regexMap{$1}/e;
print $line;
}