Как упоминал Энди, вам нужно использовать eq
, а не ==
, и он должен привязать ваше регулярное выражение. В этом случае вам также не нужно обертывать все условия в цепочке ||
.
Есть 2 «отличия», о которых я могу думать: производительность и читаемость. «||» цепочка более совершенна, но только немного. Если вы добавили больше терминов, регулярное выражение в конечном итоге побьет его. Регулярное выражение, вероятно, более читаемо, и его легче расширять и модифицировать.
Вот Тест, который я использовал для проверки производительности.
use Benchmark 'cmpthese';
my $cmd = 'recv';
cmpthese(-1, {
REG => sub {
if ($cmd =~ /^(?:send|regd|succ|fail|recv)$/) {
return 1;
}
},
OR => sub {
if ($cmd eq 'send'||$cmd eq 'regd'||$cmd eq 'succ'||$cmd eq 'fail'||$cmd eq 'recv') {
return 1;
}
},
});
Я проверка recv
, как это последний в цепочке должно быть медленным, чтобы пройти.
Однако, если это ваша производительность после, определите хеш допустимых команд в верхней части вашего скрипта. Позже вы можете просто проверить, содержит ли хэш этот командный ключ. Это самый быстрый способ. Это также очень читаемо и тривиально легко дополняется дополнительными командами.
my %valid = map { $_ => 1 } qw(send regd succ fail recv);
# Later ...
if ($valid{$cmd}) { return 1; }
Второй оператор 'if' использует числовые оператор равенства '==' для проверки строк. Это должно быть 'eq', оператор равенства строк. – mttrb
Первый будет соответствовать слишком много - любая строка с send, regd и т. Д. В них. –