Лучший способ проверить, имеет ли строка одно из многих значений в Perl?

#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)$/;