Обычное сравнение

Наряду с умным сравнением в given-when также можно использовать обычные, «глупые» сравнения. Конечно, ничего плохого в них нет, просто это самые обычные поиски совпадений по регулярным выражениям, которые вам уже известны. Обнаружив в блоке when явно заданный оператор сравнения (любого типа) или оператор привязки, Perl делает только то, что делают эти операторы:

use 5.010;
given( $ARGV[0] ) {
when( $_ =~ /fred/i ) { say 'Name has fred in it'; continue }
when( $_ =~ /^Fred/ ) { say 'Name starts with Fred'; continue }
when( $_ eq 'Fred' ) { say 'Name is Fred' }
default { say "I don't see a Fred" }
}

Допускается даже смешанное использование умных и обычных сравнений; для каждого отдельного блока when сравнения вычисляются отдельно от других блоков:

use 5.010;
given( $ARGV[0] ) {
when( /fred/i ) { #smart
say 'Name has fred in it'; continue }
when( $_ =~ /^Fred/ ) { #dumb
say 'Name starts with Fred'; continue }
when( 'Fred' ) { #smart
say 'Name is Fred' }
default { say "I don't see a Fred" }
}

Для поиска по шаблону умное сравнение не отличается от обычного, поскольку операторы регулярных выражений по умолчанию привязываются к $_.


Оператор умного сравнения ищет совпадения (полные или частичные), поэтому он не работает для сравнений типа «больше» или «меньше». В таких случаях необходимо использовать традиционные операторы сравнения:

use 5.010;
given( $ARGV[0] ) {
when( /^?\d+\.\d+$/ ) { # Умное сравнение
say 'Not a number!' }
when( $_ > 10 ) { # Обычное сравнение
say 'Number is greater than 10' }
when( $_ < 10 ) { # Обычное сравнение
say 'Number is less than 10' }
default { say 'Number is 10' }
}

В некоторых ситуациях Perl автоматически использует обычные сравнения. Например, если в when включается результат вызова пользовательской функции, Perl использует логическое значение (true/false) возвращаемого значения:

use 5.010;
given( $ARGV[0] ) {
when( name_has_fred( $_ ) ) { # Обычное сравнение
say 'Name has fred in it'; continue }
}

Правило о вызове функции распространяется и на встроенные функции Perl defined, exists и eof, возвращающие логический результат. Умное сравнение также не используется для инвертированных выражений, включая инвертированные регулярные выражения. Эти случаи ничем не отличаются от условий управляющих конструкций, представленных в предыдущих главах:

use 5.010;
given( $ARGV[0] ) {
when( ! $boolean ) { # Обычное сравнение
say 'Name has fred in it' }
when( ! /fred/i } { # Обычное сравнение
say 'Does not match Fred' }
}

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

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

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