Переключатель Perl не проваливается должным образом? - PullRequest
4 голосов
/ 19 июня 2010

У меня есть значение ($ field), которое я хочу проверить. Прочитайте документацию perl (http://perldoc.perl.org/Switch.html#Allowing-fall-through), и выясните, что я это прибил. Кажется, нет, потому что, если я передаю «Смещение экспозиции», выходных данных нет, хотя «Значение смещения экспозиции» работает как следует. ошибки, поэтому я понятия не имею.

use Switch;
use strict; use warnings;

my $field = 'Exposure Bias';

switch($field){
    case 'Exposure Bias' {next;}
    case 'Exposure Bias Value' {print "Exp: $field\n";}
}

Обновление

Я предполагаю, что это неправильно. Что я хочу сделать с этим переключателем, так это запустить печать, если совпадает любой случай. Я думал, что next передаст контроль коду следующего дела, но это была моя ошибка.

Как мне это кодировать, чтобы код во втором случае выполнялся, если первый случай совпадает?


Рабочий раствор

given($field){
    when(['Exposure Bias','Exposure Bias Value']){print "Exp: $field\n";}
}

Ответы [ 2 ]

7 голосов
/ 19 июня 2010

Комментарии ДВК о том, почему ваш коммутатор работает не так, как вы ожидаете, верны, но он не упоминает о лучшем, более безопасном способе реализации вашего коммутатора.

Switch создан с использованием источникафильтры и устарели и их лучше избегать.Если вы работаете с Perl 5.10 или новее, используйте given и when для построения оператора switch:

use strict;
use warnings;

use feature qw(switch);

my $field = 'Exposure Bias';

given($field) {
    when ([ 
        'Exposure Bias', 
        'Exposure Bias Value',
    ]) {
        print 'Exp: ' . $field . "\n"; 
    }
}

См. perlsyn для получения дополнительной информации.

5 голосов
/ 19 июня 2010

Значение переключателя 'Смещение экспозиции' не равно значению второго случая (оба они являются строками, равенство строк используется согласно таблице в начале POD).

Поэтому, когда провал заставляет переключатель перейти ко второму случаю; это просто не соответствует. Поскольку больше нет случаев, он выходит.

Чтобы проиллюстрировать, этот код напечатает вывод Second case for bias, если вы запустите его:

use Switch;
use strict; use warnings;

my $field = 'Exposure Bias';

switch($field){
    case 'Exposure Bias' {next;}
    case 'Exposure Bias Value' {print 'Exp: ' . $field . "\n";}
    case /Exposure Bias/ { print "Second case for bias\n";} # RegExp match
}

Он начинает работать так же, как ваш код (первый совпадает, next вызывает переход ко второму, второй не совпадает), и, так как есть третий случай, и он соответствует, этот блок получает казнены.

Я не совсем уверен, как вы хотели, чтобы второй случай совпадал (например, по какой логике "Значение смещения экспозиции" будет соответствовать значению "Смещение экспозиции") - единственное, что приходит на ум, это то, что вы хотели ваше поле "действовать как регулярное выражение и каждое значение регистра должно быть строкой, сопоставленной с этим регулярным выражением. Если это так, вам нужно записать его следующим образом, используя тот факт, что значение переключателя может быть ссылкой на подпрограмму (к сожалению, это не может быть регулярным выражением, хотя, как вы видели выше, это возможно):

use Switch;
use strict; use warnings;

my $field = sub { return $_[0] =~ /Exposure Bias/ };

switch($field){
    case 'Exposure Bias' {next;}
    case 'Exposure Bias Value' {print "Exp\n";}
}

Последний производит Exp вывод.


UPDATE

На основании обновленной информации в вопросе проще всего просто указать обе строки во втором случае как arrayref:

use Switch;
use strict; use warnings;

my $field = "Exposure Bias";

switch($field){
    case 'Exposure Bias' { print "First match\n"; next;}
    case ['Exposure Bias Value', 'Exposure Bias'] {print "Exp: $field\n";}
}

$ perl ~/a.pl
First match
Exp: Exposure Bias

Лучше абстрагироваться от значения, конечно:

use Switch;
use strict; use warnings;

my $field = "Exposure Bias";
my $exp_bias = 'Exposure Bias';

switch($field){
    case "$exp_bias" { print "First match\n"; next;}
    case ['Exposure Bias Value', "$exp_bias" ] {print "Exp: $field\n";}
}
...