2014-09-19 235 views
0

我想在if语句中使用范围运算符来打印某些值,只要$ b的值介于1和3之间,但下面的代码会进入无限循环。 我不确定在if语句中range操作符是如何工作的。范围运算符if语句进入无限循环

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

在此先感谢

+3

你不提,其产生的警告。 – ysth 2014-09-19 06:16:04

+0

感谢大家的回复。还有一件事情,如果我在“..”左侧有两个条件,那么它将如何工作,即#!/ usr/bin/perl ##使用警告; (($ c = 1和$ b = 3)...不是$ b--) print(“c和b的值是$ c和$ b \ n”); } }“if()”的范围是什么? – user2896215 2014-09-20 00:11:06

+0

如果任一操作数为..是一个常量,则它被视为如同您所说的那样是常量,所以检查行号。如果操作数是任何其他表达式,则该表达式将被评估为布尔值。所以你的例子根本不依赖于行号。注意($ c = 1和$ b = 3)始终为真;你的意思是==不= =? – ysth 2014-09-21 03:27:53

回答

0

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

您正在使用

if($b = 1..3){ 

由于它是往里走if条件是到$b分配值1所以每次它的价值将保持为1,这就是它无限循环的方式。

使这一循环到范围内的工作1..3可以使用

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

+0

'$ b == 1..3'不会做任何有用的东西。 – 2014-09-19 12:23:33

0

我想你想打印“测试”,如果$ b等于1个或2或3。您的代码会给“在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"; 
    } 
} 
+1

你需要锚:'/^[1-3] \ z /';否则任何在其中任何位置具有1,2或3的数字也将匹配。 – ysth 2014-09-19 06:24:59

+0

是的,的确如此。他有1到10个硬编码和<10,所以我没有提到。但你的一个是通用的:D – Jassi 2014-09-19 06:36:28

+0

哦,好点。 – ysth 2014-09-19 06:42:22

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 
+0

你当然是对的......我简单地迷惑了自己。固定。 – Miller 2014-09-19 06:33:37

5

..在标量上下文不在此范围操作,这是触发器操作。你会正确使用它是这样的:直到第一个条件

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

触发器返回false返回true(隐含地视为需要被比作$常量,当前的行号)。然后它继续返回,直到第二个条件成立。因此,在上面的示例中,仅为输入的第1行至第3行输入了if块。

无限循环是因为您每次通过循环将''分配给$ b;也许你的意思是==(比较),而不是=(转让)。但即使如此,这种方式也不适用于您尝试的方式。

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

if ($b >= 1 && $b <= 3) { 
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