1

这太长了:

 if (    $self->{status} == 1 ||
         $self->{status} == 2 || 
         $self->{status} == 3
    ){                                                                                                                                                                                   
     $self->status(4);
 } else {                   
     croak "only 1,2 and 3 change to 4";
}     

你会如何让它更好更短?

4

6 回答 6

4

也许使用智能匹配运算符:

if ( $self->{status} ~~ [1,2,3] ) {
于 2013-08-23T04:29:13.263 回答
2

您可以使用三元运算符:

$self->{status} ~~ [1,2,3] ? $self->status(4) : croak "only 1,2 and 3 change to 4";
于 2013-08-23T04:32:12.973 回答
1

如果 status 始终为正整数,您可以:

if($self->{status} < 4)
{
   $self->status(4);
} else {                   
 croak "only 1,2 and 3 change to 4";
}     
于 2013-08-23T12:53:47.240 回答
1

不知道它是否更好,但是..

foreach my $x (1,2,3,4,5){

    if (map{ $x == $_ ? 1 : () }(1,2,3) ){
        print "is 1,2, or 3\n";
    } else {
        printf "is %s\n", $x;
    }

}
于 2013-08-23T12:07:42.350 回答
0

如果您的 perl 足够新,可以进行智能匹配:

$self->{status} ~~ (1,2,3) and $self->status(4) or croak "...";
于 2013-08-23T04:31:59.400 回答
0

也许不是世界上最有效的方式,但不依赖于实验特性或循环:

if($self->{'status'} =~ m/^(1|2|3)$/) { ... }
于 2013-08-23T14:06:06.697 回答