Ответ 1
Если вы не используете perl старше 5.10, простое чередование будет работать в любом случае (см. здесь), поэтому нет причин для попробуйте оптимизировать его.
Я пишу простой Perl script, который преобразует строки инструкции сборки в 32-разрядный двоичный код.
Я решил обработать команду группировки переводов по типу (ADD
и SUB
- это инструкции R-Type и т.д.), поэтому в моем коде я делаю что-то вроде этого:
my $bin = &r_type($instruction) if $instruction =~ /^(?:add|s(?:ub|lt|gt))\s/;
потому что я хочу обрабатывать ADD
, SUB
, slt
и sgt
тем же способом.
Я понял, что, возможно, использование этого регулярного выражения может быть "излишним" для задачи, которую я должен выполнять... может ли шаблон
/^(?:add|sub|slt|sgt)\s/
лучше использовать регулярные выражения в этом случае?
Большое спасибо.
Если вы не используете perl старше 5.10, простое чередование будет работать в любом случае (см. здесь), поэтому нет причин для попробуйте оптимизировать его.
Вместо того, чтобы помещать мнемонику в обычные выражения, создайте таблицу отправки с помощью хэша. Это будет, по крайней мере, одинаково быстрее, и ваш код будет намного проще:
my %emitter = (add => \&r_type,
sub => \&r_type,
slt => \&r_type,
sgt => \&r_type,
...);
if ($instruction =~ /^(\S+)/) {
my $emitter = $emitter{$1} // die "bad instruction $instruction";
$emitter->($1, $istruction);
}
else {
# error?...
}
Мне нравится таблица отправки salva (я много показываю в Освоение Perl), но я отвечу на другой аспект вопрос, если вам понадобится этот ответ для другой проблемы когда-нибудь.
Если вы хотите создать несколько чередований, некоторые из которых могут быть вложенными, вы можете использовать что-то вроде Regexp:: Trie для создания чередование для вас, чтобы вы не смотрели на уродливый синтаксис регулярных выражений:
use Regexp::Trie;
my $rt = Regexp::Trie->new;
foreach ( qw/add sub slt sgt/ ) {
$rt->add($_);
}
print $rt->regexp, "\n";
Это дает вам:
(?-xism:(?:add|s(?:gt|lt|ub)))
Таким образом, вы указываете коды операций, как предположил Джонатан, но также получаете чередование. Как отметил ysth, вы можете получить это бесплатно с Perl в любом случае.
Ваша вторая версия проста, понятна и удобна в обслуживании. Разница в производительности будет зависеть от реализации регулярного выражения, но я подозреваю, что вложенная версия будет работать медленнее из-за повышенной сложности.
Да, это перебор.