Подтвердить что ты не робот

Регулярное выражение /(ab)? Use/: стоит ли более сложное выражение?

Я пишу простой 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/

лучше использовать регулярные выражения в этом случае?

Большое спасибо.

4b9b3361

Ответ 1

Если вы не используете perl старше 5.10, простое чередование будет работать в любом случае (см. здесь), поэтому нет причин для попробуйте оптимизировать его.

Ответ 2

Вместо того, чтобы помещать мнемонику в обычные выражения, создайте таблицу отправки с помощью хэша. Это будет, по крайней мере, одинаково быстрее, и ваш код будет намного проще:

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?...
}

Ответ 3

Мне нравится таблица отправки 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 в любом случае.

Ответ 4

Ваша вторая версия проста, понятна и удобна в обслуживании. Разница в производительности будет зависеть от реализации регулярного выражения, но я подозреваю, что вложенная версия будет работать медленнее из-за повышенной сложности.

Да, это перебор.