是否可以在perl if语句中使用<=>运算符?

时间:2018-06-28 13:30:27

标签: perl if-statement

首先,我意识到我可以使用此运算符 编写一个if语句,该语句可以编译并运行。我想知道是否有一种方法可以使if / elsif / else的方块更加优雅。

我目前有一块看起来像这样的代码

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

因此,我希望脚本根据两个值是否相等或两者是否不相等(以较低者为准)进行操作。看来<=>运算符非常适合此操作。

6 个答案:

答案 0 :(得分:6)

这有点晦涩,但是您可以使用<=>运算符来获取调度表的元素:

(   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 }->();

答案 1 :(得分:2)

这使用<=>的结果作为数组索引,例如 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

答案 2 :(得分:0)

好吧,操作员根据测试结果返回1、0或-1,这就是sort使用的结果。

所以这样做很可行。但是,相比之下,我不确定这是否是一种特别清晰的方法;

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

我强烈建议避免使用单字母变量名称,尤其是$a$b。它的样式不佳,$a使用$bsort可能会引起混乱。

答案 3 :(得分:0)

我不会称之为优雅,但是您可以使用给定/何时捕获所有结果:

    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"
        }
    }

答案 4 :(得分:0)

从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"
    }
}

答案 5 :(得分:0)

{
    goto (qw( EQ GT LS ))[$x <=> $y];
    LS:
        say('less');
        last;
    EQ:
        say('equal');
        last;
    GT:
        say('greater');
}

But

  

如果您正在针对可维护性进行优化,则不一定建议这样做。