每当$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)