Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:if中的类似条件。如何使它变短&;更好?_Perl - Fatal编程技术网

Perl:if中的类似条件。如何使它变短&;更好?

Perl:if中的类似条件。如何使它变短&;更好?,perl,Perl,这太长了: if ( $self->{status} == 1 || $self->{status} == 2 || $self->{status} == 3 ){

这太长了:

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

您将如何使它变得更漂亮和更短?

可能使用智能匹配操作符:

if ( $self->{status} ~~ [1,2,3] ) {
$self->{status} ~~ [1,2,3] ? $self->status(4) : croak "only 1,2 and 3 change to 4";

可能通过智能匹配操作员:

if ( $self->{status} ~~ [1,2,3] ) {
$self->{status} ~~ [1,2,3] ? $self->status(4) : croak "only 1,2 and 3 change to 4";

如果您的perl足够新,可以使用smart match:

$self->{status} ~~ (1,2,3) and $self->status(4) or croak "...";

如果您的perl足够新,可以使用smart match:

$self->{status} ~~ (1,2,3) and $self->status(4) or croak "...";

您可以使用三元运算符:

if ( $self->{status} ~~ [1,2,3] ) {
$self->{status} ~~ [1,2,3] ? $self->status(4) : croak "only 1,2 and 3 change to 4";

您可以使用三元运算符:

if ( $self->{status} ~~ [1,2,3] ) {
$self->{status} ~~ [1,2,3] ? $self->status(4) : croak "only 1,2 and 3 change to 4";

不知道是否更好,但是

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

}

不知道是否更好,但是

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

}

如果状态始终为正整数,则可以:

if($self->{status} < 4)
{
   $self->status(4);
} else {                   
 croak "only 1,2 and 3 change to 4";
}     
if($self->{status}<4)
{
$self->status(4);
}否则{
“只有1、2和3变为4”;
}     

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

if($self->{status} < 4)
{
   $self->status(4);
} else {                   
 croak "only 1,2 and 3 change to 4";
}     
if($self->{status}<4)
{
$self->status(4);
}否则{
“只有1、2和3变为4”;
}     

可能不是世界上最有效的方法,但不依赖于实验性功能或循环:

if($self->{'status'} =~ m/^(1|2|3)$/) { ... }

可能不是世界上最有效的方法,但不依赖于实验特性或循环:

if($self->{'status'} =~ m/^(1|2|3)$/) { ... }

“或”是什么意思?这将检查状态是1、2还是3(不能同时为所有,是吗)?不幸的是,smartmatch在perl 5.18.0中被标记为实验性的。它甚至可能在以后的perl版本中消失。看到条目了吗?@SlavenRezic在Perl 5.12中引入隐式smartmatch之后,它现在是实验性的了?@DavidW:实际上它是在5.10.0中引入的。5.10中添加的其他内容将继续:CPANPLUS已被标记为不推荐使用,并将在下一个主要版本中删除,Module::Build是下一个不推荐使用的候选。您所说的“或”是什么意思?这将检查状态是1、2还是3(不能同时为所有,是吗)?不幸的是,smartmatch在perl 5.18.0中被标记为实验性的。它甚至可能在以后的perl版本中消失。看到条目了吗?@SlavenRezic在Perl 5.12中引入隐式smartmatch之后,它现在是实验性的了?@DavidW:实际上它是在5.10.0中引入的。5.10中添加的其他内容将继续:CPANPLUS已被标记为已弃用,并将在下一个主要版本中删除,Module::Build是下一个弃用候选。小心--。小心--。这是对map的错误使用,最好使用
grep
,例如
if(grep{$x=$}(1,2,3))
。这仍然不是我会使用的方法。非常正确。在这两方面。我在Python中工作的时间太长了。。8) 这是对map的错误使用,最好使用
grep
,例如
if(grep{$x=$}(1,2,3))
。这仍然不是我会使用的方法。非常正确。在这两方面。我在Python中工作的时间太长了。。8)