Иногда требуется выполнить однотипную обработку нескольких элементов, но 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" }
}