Условия when с несколькими элементами

Иногда требуется выполнить однотипную обработку нескольких элементов, но given каждый раз получает только один элемент. Конечно, можно заключить given в цикл foreach. Скажем, если вы хотите перебрать массив @names, присвойте текущий элемент переменной $name и используйте ее в given:

use 5.010;
foreach my $name ( @names ) {
given( $name ) {
...
}
}

Что скажете? Да, все верно: слишком много работы. (Вы еще не устали от этой фразы?) На этот раз мы определяем псевдоним для текущего элемента @names только для того, чтобы конструкция given могла определить для него другой псевдоним! Не может быть, чтобы в Perl не существовало более эффективного решения! Не беспокойтесь – конечно, оно существует. Для перебора нескольких элементов ключевое слово given вообще не потребуется. Пусть цикл foreach сам поместит текущий элемент в $_. Если вы хотите использовать умные сравнения, текущий элемент должен храниться в $_.

use 5.010;
foreach ( @names ) { # Не используем именованную переменную!
when( /fred/i ) { say 'Name has fred in it'; continue }
when( /^Fred/ ) { say 'Name starts with Fred'; continue }
when( 'Fred' ) { say 'Name is Fred'; }
default { say "I don't see a Fred" }
}

Возможно, при переборе вам потребуется узнать, с каким именно элементом вы работаете в настоящий момент.


В блок foreach можно включать и другие команды, в том числе команду say:

use 5.010;
foreach ( @names ) { # Не используем именованную переменную!
say "\nProcessing $_";
when( /fred/i ) { say 'Name has fred in it'; continue }
when( /^Fred/ ) { say 'Name starts with Fred'; continue }
when( 'Fred' ) { say 'Name is Fred'; }
default { say "I don't see a Fred" }
}

Дополнительные команды даже могут располагаться между блоками when, например команда вывода отладочной информации при входе в default (то же самое можно сделать и с given):

use 5.010;
foreach ( @names ) { # Не используем именованную переменную!
say "\nProcessing $_";
when( /fred/i ) { say 'Name has fred in it'; continue }
when( /^Fred/ ) { say 'Name starts with Fred'; continue }
when( 'Fred' ) { say 'Name is Fred'; }
say "Moving on to default...";
default { say "I don't see a Fred" }
}

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Команда given
Обычное сравнение
Оператор умного сравнения
Приоритеты умного сравнения

Вернуться в раздел: Perl / 14. Умные сравнения и given)when