为什么这个简单的while循环导致无限循环?

时间:2013-10-19 20:00:28

标签: perl while-loop infinite-loop

我遇到的问题似乎很简单,但出于某种原因,我无法绕过它。基本上我的程序导致无限循环,我不知道为什么。

以下是我遇到的具体循环:

$response1 = false;
while($response1 == false){ 
     print "Input column #: ";
     $column = <STDIN>;
     chomp($column);
     if($column =~ m/^[0-9]+$/ and $column >= 0){ 
        $response1 = true; 
     } else {
        print "Invalid response\n";
     }  
}

当我运行它时,它一直在问我"Input Column #"。我给它一个数字,它接受数字,$ response变为True,但是while循环继续,好像$response是假的。我是Perl的新手,所以也许有一些我缺少的东西,但while ($response == false)没有表明如果$response变为真,那么循环应该终止?

以下是供参考的完整代码:

#!/usr/bin/env perl

#Input control
my $response1;
my $response2;
my $response3;
my $quit = false;

#User input
my $column;
my $row;
my $continue;

#result
my $result;

#pascal subroutine 
sub pascal{
    $r = $_[0];
    $c = $_[1];
        if($r == 0 and $c == 0){
        return 1;
    } else { 
        return (($r-$c+1)/$c)*&pascal($r,($j-1));   
    }
}

print "Pascal Triangle Calculator\n";

while($quit == false){
    $response1 = false;
    $response2 = false;
    $response3 = false;
    while($response1 == false){ 
        print "Input column #: ";
        $column = <STDIN>;
        chomp($column);
        if($column =~ m/^[0-9]+$/ and $column >= 0){ 
            $response1 = true; 
        } else {
            print "Invalid response\n";
        }   
    }
    while($response2 == false){
        print "Input row #: ";
        $row = <STDIN>;
        chomp($row);
        if($row =~ m/^[0-9]+$/ and $row >= 0){
            $response2 = true;
        } else {
            print "Invalid response\n";
        }   
    }
    $result = &pascal($row,$column);
    print "The number at row $row and column $column of the Pascal triangle is $result\n";
    while($response3 == false){
        print "Calculate another? y/n: ";
        $continue = <STDIN>;
        chomp($continue);
        if($continue == m/[yYnN]/){
            $response3 = true;
        } else {
            print "Invalid response\n";
        }   
    }    
    if($continue == m/[nN]/){
        $quit = true;
    }
}

print "Goodbye!\n";

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,使用

始终是一种好习惯
use strict;
use warnings;

这对您来说非常有帮助,特别是在刚接触Perl时。虽然use strict会强制你整理代码。使用警告编译指示可以看到代码中的问题。如果我运行带有警告的代码,我会得到以下输出。

Argument "false" isn't numeric in numeric eq (==) at response_loop_test.pl line 4.
Argument "false" isn't numeric in numeric eq (==) at response_loop_test.pl line 4.

perl中的==用于比较数值。 comparic到这样的字符串将不会产生预期的效果。相反,您应该使用eq来比较字符串相等性。

if ($response1 eq 'false')

这将确保字符串相等的比较按预期工作。以下链接描述了perl http://perldoc.perl.org/perlop.html#Equality-Operators

中的相等运算符
  如果左参数在数值上等于,则

二进制“==”返回true   正确的论点。

     

如果左参数的字符串等于,则二进制“eq”返回true   正确的论点。