Есть ли способ использовать оператор <=> в операторе perl if? - PullRequest
0 голосов
/ 28 июня 2018

Для начала я понимаю, что я могу написать оператор if с этим оператором, который компилируется и выполняется. Мне интересно, есть ли способ, с помощью которого можно сделать if / elsif / else блок более элегантным.

В настоящее время у меня есть блок кода, который выглядит следующим образом

 if( $bill == $ted) {
        # Do some stuff
} elsif( $bill < $ted) {
        # Do different stuff
} else {
        # Do really weird stuff
}

Итак, есть определенные вещи, которые я хочу, чтобы скрипт выполнял, основываясь на том, равны ли два значения или нет, в зависимости от того, какое из них меньше. Кажется, что оператор <=> был бы хорошо подходит для этого.

Ответы [ 6 ]

0 голосов
/ 28 июня 2018
{
    goto (qw( EQ GT LS ))[$x <=> $y];
    LS:
        say('less');
        last;
    EQ:
        say('equal');
        last;
    GT:
        say('greater');
}

Но

Это не обязательно рекомендуется, если вы оптимизируете для удобства обслуживания.

0 голосов
/ 28 июня 2018

Используется результат <=> в качестве индекса массива, подобного ответа * choroba , но нет необходимости хранить и вызывать анонимные подпрограммы

Я бы не стал использовать его в живом коде

use strict;
use warnings;
use feature 'say';

for my $x ( 1 .. 3 ) {
    say ['equal', 'greater than', 'less than']->[$x <=> 2];
}

выход

less than
equal
greater than
0 голосов
/ 28 июня 2018

Подсказка от Draxil без экспериментальных особенностей:

use strict;
use warnings;

my $x = 1;
for ( $x <=> 2 ){
    if ($_ == -1){
        say "stuff"
    }
    if ($_ == 0){
        say "diff stuff"
    }
    if ($_ == 1){
        say "other stuff"
    }
}
0 голосов
/ 28 июня 2018

Я бы не назвал это элегантным, но вы можете использовать данное / когда, чтобы поймать все результаты:

    use strict;
    use 5.10.0;
    use feature "switch";
    use experimental "smartmatch";

    my $x = 1;
    given( $x <=> 2 ){
        when(-1){
            say "stuff"
        }
        when(0){
            say "diff stuff"
        }
        when(1){
            say "other stuff"
        }
    }
0 голосов
/ 28 июня 2018

Хорошо, оператор возвращает 1, 0 или -1 в зависимости от результата теста, который используется sort.

Так что это вполне жизнеспособно. Но я не уверен, что это особенно ясный подход по сравнению с;

if ( $first < $second ) { do X ; next}
if ( $first > $second ) { do Y ; next}
do Z. #$first == $second

Я бы настоятельно рекомендовал избегать однобуквенных имен переменных, особенно $a и $b. Это плохой стиль, и $a и $b используются sort, что может привести к путанице.

0 голосов
/ 28 июня 2018

Это немного неясно, но вы можете использовать оператор <=>, чтобы получить элемент таблицы отправки:

(   sub { say 'they are the same' },
    sub { say 'x is greater' },
    sub { say 'x is lesser' }
)[$x <=> $y]->();

Он основан на том факте, что индекс -1 возвращает последний элемент списка.

Использование хеша может быть более читабельным.

{    0 => sub { say 'they are the same' },
     1 => sub { say 'x is greater' },
    -1 => sub { say 'x is lesser' }
}->{ $x <=> $y }->();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...