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

use*_*215 0 perl

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

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

提前致谢

Mil*_*ler 6

一个范围操作..不工作,你正在尝试使用它的方式.您if的等同于以下内容:

if ( $b = ($. == 1) .. ($. == 3) ) {
Run Code Online (Sandbox Code Playgroud)

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

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

#!/usr/bin/perl
use warnings;

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

输出:

test
test
test
Run Code Online (Sandbox Code Playgroud)


yst*_*sth 5

..在标量上下文中不是范围运算符,它是触发器操作符.你会像这样适当地使用它:

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

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

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

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

if ( $b >= 1 && $b <= 3 ) {
Run Code Online (Sandbox Code Playgroud)