首先,我意识到我可以使用此运算符 编写一个if语句,该语句可以编译并运行。我想知道是否有一种方法可以使if
/ elsif
/ else
的方块更加优雅。
我目前有一块看起来像这样的代码
if( $bill == $ted) {
# Do some stuff
} elsif( $bill < $ted) {
# Do different stuff
} else {
# Do really weird stuff
}
因此,我希望脚本根据两个值是否相等或两者是否不相等(以较低者为准)进行操作。看来<=>
运算符非常适合此操作。
答案 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
使用$b
和sort
可能会引起混乱。
答案 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:
如果您正在针对可维护性进行优化,则不一定建议这样做。