if语句中的range运算符进入无限循环



每当$b的值在1到3之间时,我试图在if语句中使用范围运算符来打印一些内容,但下面的代码会进入无限循环。我不确定if语句中的范围运算符是如何工作的。

#!/usr/bin/perl
use warnings;
for ($b = 0; $b < 10; $b++) {
    if ($b = 1 .. 3) {
        print "testn";
    }
}

提前感谢

范围运算符..的工作方式与您尝试使用它的方式不同。您的if等效于以下内容:

if ( $b = ($. == 1) .. ($. == 3) ) {

因为您没有执行任何文件操作,所以$.将是未定义的。因此,范围将始终抛出警告并失败,并将undef分配给$b。然后,因为$b被分配了一个值,所以for循环将永远不会退出。

你需要使用简单的比较器:

#!/usr/bin/perl
use warnings;
for ( $b = 0; $b < 10; $b++ ) {
    if ( $b >= 1 && $b <= 3 ) {
        print "testn";
    }
}

输出:

test
test
test
标量上下文中的..不是范围运算符,而是触发器运算符。你应该像这样恰当地使用它:
while ( my $line = readline $filehandle ) {
    # print only first three lines
    if ( 1..3 ) {
        print "line $.: $linen";
    }
}

触发器返回false,直到第一个条件(常量被隐式处理为需要与当前行号$.进行比较)返回true。然后它继续返回true,直到第二个条件为true。因此,在上面的例子中,if块只为输入的第1行到第3行输入。

无限循环是因为每次通过循环都要将"赋值给$b;也许你指的是==(比较),而不是=(分配)。但即便如此,也无法像你所尝试的那样在靶场发挥作用。

如果你想检查一个数字是否在给定的范围内,不要使用范围运算符或触发器运算符;比较一下:

if ( $b >= 1 && $b <= 3 ) {

如果$b等于1、2或3,我想您应该打印"test"。您的代码将给出"在test.pl第6行的范围内使用未初始化的值(或失败)",而不是3次,它将打印10次。

建议代码为:

#!/usr/bin/perl
use strict;
use warnings;
for (my $b = 0; $b<10; $b++){
  if($b =~ /[1-3]/){
    print "testn";
  }
}

@Miller的响应非常好,非常适合您的需求。如果您正在寻找一种搜索方法,如果一个值包含在一个数组中(数值或非数值、非连续值等),请查看List::Util CPAN模块。

这个例子在数组中查找值5:

use strict;
use warnings;
use List::Util qw/any/;
my @range = (1 .. 100);
my $search_for = 5;
my $found_in_range = any { $_ == $search_for } @range;
print $found_in_range, "n";  #<-- prints: 1

我认为问题出在您的if条件中

您正在使用

if($b = 1..3){

当它进入if条件时,它将值1分配给$b,所以每次它的值都将保持为1,这就是它在无限循环中移动的方式。

为了使这个循环在1..3范围内工作,你可以使用

if($b == 1 || $b == 2 ||$b == 3)if($b >= 1 && $b <= 3)

最新更新