我遇到的问题似乎很简单,但出于某种原因,我无法绕过它。基本上我的程序导致无限循环,我不知道为什么。
以下是我遇到的具体循环:
$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";
答案 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 正确的论点。