2013-10-19 4 views
0

정말 간단하게 보이지만 어떤 이유로 그 문제를 해결할 수없는 문제가 있습니다. 기본적으로 내 프로그램은 무한 루프를 일으키고 있으며 이유를 모르겠습니다. 내가 그것을 실행하면루프가 무한 루프를 일으키는 동안 왜 이렇게 간단합니까?

$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 #" 저를 요구 유지 :

는 여기가에 걸리지있어 특정 루프입니다. 숫자를주고 숫자를 받으면 $ 반응은 True로 바뀌지 만 while 루프는 마치 $response이 false 인 것처럼 계속 진행합니다. 나는 Perl을 처음 사용하기 때문에 누락 된 부분이있을 수도 있지만 while ($response == false)$response이 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"; 
+4

'use strict; 경고를 사용하십시오; 진단을 사용하고, ' –

+2

'use strict; 경고를 사용하십시오. "실제로 오류 (및 기타 오류)가 표시됩니다. 항상 이것들을 사용하십시오! – ikegami

+2

'true'와'false'는 Perl에서 불리언 값이 아닙니다. 어떤 모듈이나 다른 특별한 기능이로드되지 않으면, 그들은 barewords입니다. 문자열은 부울 컨텍스트에서는 true이지만 숫자 컨텍스트'=='에서는 false입니다. – TLP

답변

1

, 항상이 때 새로운 펄에 크게 특히 도움이 될 것

use strict; 
use warnings; 

을 사용하는 것이 좋습니다. strict를 사용하면 코드를 정리할 필요가 있습니다. 코드의 문제는 warnings 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') 

이렇게하면 예상 한대로 문자열의 동일성을 비교할 수 있습니다. 다음 링크는 펄 http://perldoc.perl.org/perlop.html#Equality-Operators

진 "=="의 평등 연산자를 설명 왼쪽 인자가 오른쪽 인자와 같은 수치의 경우는 true를 돌려줍니다.

이진 "eq"는 왼쪽 인수가 오른쪽 인수 인 과 같은 문자열이면 true를 반환합니다.

관련 문제