Я не прекращаю его хвалить. Достоинств у него хватает, но, да, в тонкостях сложен. На практике в такие дебри, куда я залезаю, никто не полезет. Просто хочу уточнить свое понимание той или иной фичи.
Кстати, платят за него весьма хорошо. Вот подумываю...
Следующий тест.
В Perl 5.10 появились новые фичи. Например, функция IO::Handle::say, как аналог print, но с завершающим строку терминатором. Для текстового вывода это удобно. Также появился оператор на подобии switch, но совсем другой. Называется given/when.
given (EXPR) {
when (COND1) { ... }
when (COND2) { ... }
when (COND3) { ... }
default { .... }
}
Как водится в Perl, это не единый оператор, а несколько отдельных, совместно выполняющих некую работу. Оператор given производит действие аналогичное
{
local $_ = EXPR;
...
}
Т.е. является оберткой и может быть заменен на любой другой блок (операторы if/unless/elsif/else блоками не являются!), например на блок for.
Оператор when выполняет контекстное преобразование условия в другое выражение. Внутри блока when оператор continue позволяет завершить текущий блок и начать проверку условий в последующих when. Можно сказать, что виртуально получается нечто вроде:
{
local $_ = EXPR;
if (NEW_COND1) { ....; last; }
if (NEW_COND2) { ....; last; }
if (NEW_COND3) { ....; last; }
....; # default
}
Я новых фич 5.10 еще не использовал, довольствуясь классическим (последние лет 15) 5.6. Решил потренироваться.
И так, простой тестик.
#!/usr/bin/perl -W
use 5.010;
use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
for ('a', 1..5, 'b') {
print 'Value "', $_,'" is ';
when (!looks_like_number($_)) { say 'not number' }
when ($_ & 1) { say 'odd number' }
when (not ($_ & 1)) { say 'even number' }
default { say 'unknown' }
}
continue {
say('Number parity test: ', $_ & 1 ? 'odd' : 'even') if (looks_like_number($_));
}
Value "a" is not number
Value "1" is odd number
Number parity test: odd
Value "2" is even number
Number parity test: even
Value "3" is unknown
Number parity test: odd
Value "4" is even number
Number parity test: even
Value "5" is unknown
Number parity test: odd
Value "b" is not number
Это чо?
Модифицирую: переношу выражение в функцию.
#!/usr/bin/perl -W
use 5.010;
use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
sub is_odd { $_[0] & 1 }
for ('a', 1..5, 'b') {
print 'Value "', $_,'" is ';
when (!looks_like_number($_)) { say 'not number' }
when (is_odd($_)) { say 'odd number' }
when (!is_odd($_)) { say 'even number' }
default { say 'unknown' }
}
continue {
say('Number parity test: ', is_odd($_) ? 'odd' : 'even') if (looks_like_number($_));
}
Value "a" is not number
Value "1" is odd number
Number parity test: odd
Value "2" is even number
Number parity test: even
Value "3" is odd number
Number parity test: odd
Value "4" is even number
Number parity test: even
Value "5" is odd number
Number parity test: odd
Value "b" is not number
Все путем.
Оператор не является аналогом switch. Нужно изучать. man perlsyn