当前位置: 首页 > 知识库问答 >
问题:

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

国阳
2023-03-14

我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。

下面是我陷入的特定循环:

$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";
     }  
}

当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response==false)是否表明如果<code>要成为true,循环应该终止?

以下是整个代码供参考:

#!/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个答案

公西志文
2023-03-14

正如评论中提到的,使用

use strict;
use warnings;

这将极大地帮助您,尤其是在不熟悉Perl时。虽然使用严格会迫使您整理代码。您代码中的问题可以通过使用警告pragma看到。如果我运行带有警告的代码,我会得到以下输出。

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 中的 == 用于比较数值。与这样的字符串相比,不会产生预期的效果。相反,您应该使用 eq 来比较字符串相等性。

if ($response1 eq 'false')

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

如果左参数在数值上等于右参数,则二进制"=="返回true。

如果左参数在字符串方向上等于右参数,则二进制“eq”返回true。

 类似资料:
  • 尝试编写一个程序,其中用户输入他们一周的费用。麻烦在于我希望程序重新询问用户是否输入了不可接受的输入。我想出了如何检测负值的方法,但是当尝试捕获输入不匹配异常(如果像输入字符或字符串一样)时,循环只是无限运行,要求“星期一费用:”我如何使它,以便用户有另一个回答的机会?我试着Rest一下;但是这也打破了做而循环,我不想要。 这是我目前为止的代码: 谢谢你的帮助

  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 我正在Drools中编写一个规则集,以下情况会通过重新触发规则导致无限循环: 以下规则更改不会导致无限循环,即当ObjectB中不再引用a1时: 另一种不会导致无限循环的情况是当我将更改为 将“触发重新评估知识库中匹配对象类型的所有模式”,但由于我正在修改的字段field3没有在LHS条件中使用,我认为不应该重新评估。然而,我不能肯定这与引用a1有关。字段1位于ObjectB中,但我找不到具体的原

  • 该程序应该使用int 0x10在ASCII中打印一个具有给定字符的金字塔,3行的预期结果(下面代码中使用的数量)将是: A. a a a a a 要编译和运行代码,我使用nasm编译它,然后使用qemu进行仿真: 然而,程序get无法打印所有ASCII值。此外,如果有任何针对nasm代码的调试器,可以让您逐行运行,允许您检查寄存器值,这对学习也很有帮助。

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码

  • 我的期望: 如果用户输入的Int不在正确的范围内,程序将给他另一次机会,直到用户给出正确的类型。 所以,我需要一个块。但我有一个无限循环。 我的代码: 我读到: 重置. nextLine()扫描仪 使用扫描仪。扫描仪后面的nextLine()。nextInt() nextInt()的扫描仪错误 扫描仪在使用next()或nextFoo()后跳过nextLine()? 如何使用java.util.扫