#perl
#perl
Вопрос:
Я как раз в середине некоторого кода на Perl, и я обнаружил, что пишу чудовищную строку кода, показанную ниже. Perl настолько полон замечательных маленьких ярлыков, что просто должен быть лучший способ, чем этот, верно?
Итак, есть ли лучший способ сделать это:
unless($config->{'case_transform'} eq 'NONE' ||
$config->{'case_transform'} eq 'UPPER' ||
$config->{'case_transform'} eq 'LOWER' ||
$config->{'case_transform'} eq 'CAPITAL' ||
$config->{'case_transform'} eq 'RANDOM')
{
$config->{'case_transform'} = 'NONE';
}
Ответ №1:
my %good_value = map { $_ => 1 } qw( NONE UPPER LOWER CAPITAL RANDOM );
unless $good_value{$config->{case_transform}) {
$config->{case_transform} = 'NONE';
}
Комментарии:
1. Если вы использовали
map {$_ => $_}
, вы могли бы заменить тест / назначение на$config->{case_transform} = $good_value{$config->{case_transform}} || 'NONE'
. Я оставлю это на личный вкус относительно того, действительно ли это улучшение.
Ответ №2:
Также доступен оператор «Smart Match» ~~
.
use 5.010;
$config->{'case_transform'} = 'NONE'
unless $config->{'case_transform'} ~~
( 'NONE', 'UPPER', 'LOWER', 'CAPITAL', 'RANDOM' );
Ответ №3:
unless ($config->{'case_transform'} =~ /^(NONE|UPPER|LOWER|CAPITAL|RANDOM)$/)
{
...
}
Комментарии:
1. Решение регулярных выражений легко распространить на случаи, когда входные данные имеют начальные / конечные пробелы или совпадения без учета регистра.
2. … и теперь у вас две проблемы 🙂
Ответ №4:
$config->{'case_transform'} = 'NONE' unless $config->{'case_transform'} =~ /^(?:UPPER|LOWER|CAPITAL|RANDOM)$/;