Иногда вместо given удобно использовать for, например, чтобы сделать несколько проверок для каждого элемента массива.
Однако, эта легкость замены дает ложное ощущение возможности и обратного — использования given вместо for.
Есть такой старый трюк, когда for нужен лишь для того, чтобы топикализировать переменную и с легкостью пользоваться функциями, по умолчанию использующими $_.
Например:
for ($url) {
s{\.?*}{};
s{^/}{};
s{/$}{};
}
Фактически никакого цикла здесь нет, и уж если подключен use 5.10, хочется использовать given. Однако, не тут-то было. Хотя given и создаст переменную $_, но она будет всего лишь лексической переменной в пределах блока given, а не синонимом $url.
use v5.10;
use strict;
my $string = 'Hello, Perl';
my $another = $string;
for ($string) {
s/Hello/Hallo/;
s/Perl/C++/;
}
given ($another) {
s/Hello/Hi/;
s/Perl/JavaScript/;
}
say $string; # Hallo, C++
say $another; # Hello, Perl
Этот пример выведет измененную строку после блока с for и неизменную — после given. Будьте внимательны :-)
Неожиданно :)