我想在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";
}
}
在此先感谢
我想在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";
}
}
在此先感谢
我认为问题出在你的if
条件
您正在使用
if($b = 1..3){
由于它是往里走if
条件是到$b
分配值1所以每次它的价值将保持为1,这就是它无限循环的方式。
使这一循环到范围内的工作1..3
可以使用
if($b == 1 || $b == 2 ||$b == 3)
或if($b >= 1 && $b <= 3)
'$ b == 1..3'不会做任何有用的东西。 – 2014-09-19 12:23:33
我想你想打印“测试”,如果$ 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";
}
}
一个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
你当然是对的......我简单地迷惑了自己。固定。 – Miller 2014-09-19 06:33:37
..
在标量上下文不在此范围操作,这是触发器操作。你会正确使用它是这样的:直到第一个条件
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) {
@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
你不提,其产生的警告。 – ysth 2014-09-19 06:16:04
感谢大家的回复。还有一件事情,如果我在“..”左侧有两个条件,那么它将如何工作,即#!/ usr/bin/perl ##使用警告; (($ c = 1和$ b = 3)...不是$ b--) print(“c和b的值是$ c和$ b \ n”); } }“if()”的范围是什么? – user2896215 2014-09-20 00:11:06
如果任一操作数为..是一个常量,则它被视为如同您所说的那样是常量,所以检查行号。如果操作数是任何其他表达式,则该表达式将被评估为布尔值。所以你的例子根本不依赖于行号。注意($ c = 1和$ b = 3)始终为真;你的意思是==不= =? – ysth 2014-09-21 03:27:53