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

时间:2014-09-19 05:59:07

标签: perl

我试图在if语句中使用range运算符,只要$ b的值在1到3之间就打印出来,但是下面的代码进入无限循环。 我不确定if语句中的range运算符是如何工作的。

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

提前致谢

5 个答案:

答案 0 :(得分:6)

Range operator ..无法按照您尝试使用它的方式运行。您的if等同于以下内容:

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

由于您未执行任何文件操作,因此$.将未定义。因此,范围将始终发出警告并失败,并将undef分配给$b。然后,因为$b被赋值,for循环将永远不会退出。

您需要使用simple comparators

#!/usr/bin/perl
use warnings;

for ( $b = 0; $b < 10; $b++ ) {
    if ( $b >= 1 && $b <= 3 ) {
        print "test\n";
    }
}

输出:

test
test
test

答案 1 :(得分:5)

标量上下文中的

..不是范围运算符,而是触发器运算符。你会像这样适当地使用它:

while ( my $line = readline $filehandle ) {
    # print only first three lines
    if ( 1..3 ) {
        print "line $.: $line\n";
    }
}

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

无限循环是因为每次循环都要为$ b分配'';也许你的意思是==(比较),而不是=(赋值)。但即便如此,也不会像你尝试的方式一样。

如果要检查数字是否在给定范围内,请不要使用范围运算符或触发器运算符;只是比较:

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

答案 2 :(得分:0)

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

您正在使用

if($b = 1..3){

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

要使此循环在1..3范围内工作,您可以使用

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

答案 3 :(得分:0)

我认为如果$ 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 "test\n";
  }
}

答案 4 :(得分:0)

@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