Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 如果基于条件的查找不起作用_Perl - Fatal编程技术网

Perl 如果基于条件的查找不起作用

Perl 如果基于条件的查找不起作用,perl,Perl,我想查找一个范围,并返回组id,尽管一个简单的基于if的查找可以工作。但是,它不起作用,我不知道为什么。 有人能帮忙吗 #!/usr/bin/perl sub get_xid { my $x_id = ""; if(($_[0] ge 1) && ($_[0] le 4)) { $x_id = "x.1"; } if(($_[0] ge 5) && ($_[0] le 8)) { $x

我想查找一个范围,并返回组id,尽管一个简单的基于if的查找可以工作。但是,它不起作用,我不知道为什么。 有人能帮忙吗

#!/usr/bin/perl

sub get_xid {
        my $x_id = "";

        if(($_[0] ge 1) && ($_[0] le 4))        { $x_id = "x.1"; }
        if(($_[0] ge 5) && ($_[0] le 8))        { $x_id = "x.2"; }
        if(($_[0] ge 9) && ($_[0] le 12))       { $x_id = "x.3"; }
        if(($_[0] ge 13) && ($_[0] le 16))      { $x_id = "x.4"; }
        if(($_[0] ge 17) && ($_[0] le 20))      { $x_id = "x.5"; }
        if(($_[0] ge 21) && ($_[0] le 24))      { $x_id = "x.6"; }
        if(($_[0] ge 25) && ($_[0] le 28))      { $x_id = "x.7"; }
        if(($_[0] ge 29) && ($_[0] le 32))      { $x_id = "x.8"; }

        return $x_id;
}

for($i=1;$i<=31;$i++) {
        $x_id = &get_xid($i);
        print " i: $i, x_id: $x_id\n";
}

在Perl中,数字的比较运算符是
。如果使用字符串运算符(
le
ge
等),则将数字作为字符串进行比较。因此,例如,
10
大于
1
,但小于
4

还要注意,您正在进行冗余测试。考虑

    if($_[0] < 1)            { you didn't cover this case }
    elsif($_[0] <= 4)        { $x_id = "x.1"; }
    elsif($_[0] <= 8)        { $x_id = "x.2"; }
    elsif($_[0] <= 12)       { $x_id = "x.3"; }
    etc...
如果($\u[0]<1){您没有涵盖此案例}

elsif($\[0]
le
ge
用于字符串比较。将它们替换为
=

或者,您可以这样编写函数

sub get_xid {

    my ($v) = @_;

    return $v < 1 || $v > 32 ? "" : 'x.'.int(($v+3)/4);
}
sub get_xid {

    my ($v) = @_;

    return $v < 1 || $v > 32 ? "" : 'x.'.int(($v+3)/4);
}
 i: 1, x_id: x.1
 i: 2, x_id: x.1
 i: 3, x_id: x.1
 i: 4, x_id: x.1
 i: 5, x_id: x.2
 i: 6, x_id: x.2
 i: 7, x_id: x.2
 i: 8, x_id: x.2
 i: 9, x_id: x.3
 i: 10, x_id: x.3
 i: 11, x_id: x.3
 i: 12, x_id: x.3
 i: 13, x_id: x.4
 i: 14, x_id: x.4
 i: 15, x_id: x.4
 i: 16, x_id: x.4
 i: 17, x_id: x.5
 i: 18, x_id: x.5
 i: 19, x_id: x.5
 i: 20, x_id: x.5
 i: 21, x_id: x.6
 i: 22, x_id: x.6
 i: 23, x_id: x.6
 i: 24, x_id: x.6
 i: 25, x_id: x.7
 i: 26, x_id: x.7
 i: 27, x_id: x.7
 i: 28, x_id: x.7
 i: 29, x_id: x.8
 i: 30, x_id: x.8
 i: 31, x_id: x.8