我试图在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";
}
}
提前致谢
答案 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