2014-05-18 2 views
0

숫자 목록의 합계, 최대 값 및 최소값을 인쇄하려고하는데 작동하지 않으려 고합니다.빈 줄을 입력하면 펄이 while 루프를 종료하지 않습니다.

나는 종료해야 루프를 입력 누르면하지만 를 입력 감지 할 경우, 프로그램은 이전하지 chomp 입력 할 수있는,

use strict; 
use warnings; 

my @items; 
my ($sum, $max, $min); 

while (chomp(my $num = <STDIN>)) { 
    last if ($num eq '\n'); 

    $max ||= $num; 
    $min ||= $num; 
    $sum += $num; 

    $max = $num if ($num > $max); 
    $min = $num if ($num < $min); 

    push(@items, $num); 
} 

printf("Entered numbers are: %s \n", join(', ', @items)); 
print("Sum of all numbers is : ", $sum); 
print "\n"; 
print("Minimum number is : ", $min); 
print "\n"; 
print("Maximum number is : ", $max) 
+0

이 질문은 [link] (http://stackoverflow.com/questions/23707595/error-in-finding-minimum-element-in-perl)와 같은 질문입니까? – Glenn

+0

예 @borodin이 다른 질문으로 질문하라고했습니다. – Dinesh

+0

@Glenn : 프로그램은 비슷하지만 이전 질문의 문제점은 최소값이 인쇄되지 않았다는 것입니다. 이번 루프가 종료되지 않는다 – Borodin

답변

2
  • 당신이

    while (chomp(my $num = <STDIN>)) { ... } 
    

    같은 while 조건 내에서 chomp를 사용할 수없는 경우 파일의 끝 부분에있는 <> 반환 undef. 이 입력이 정규 표현식 /\S/

  • 를 사용하여 비 공백 문자가 포함되어 있는지 여부를 확인하는 것 같은 당신은 루프를 종료 루프

  • 의 첫 번째 문으로 간단한 방법을 chomp를 삽입해야합니다 확인

    last if ($num eq '\n') 
    

    chomp을 입력하여 개행을 제거 했으므로 작동하지 않습니다. 또한 작은 따옴표를 사용하는 경우 '\n'\의 두 자로 된 문자열 다음에 n이옵니다. 스칼라 변수가 처음이 값 undef을 가지고 선언 할 때 당신은 줄 바꿈

  • 을 만들 "\n"처럼 따옴표가 필요합니다, 그래서 당신은 이전 값이 이미하지 않는 $min$max을 이것에 대한 테스트 및 업데이트하여 모든 서투른 초기화를 방지 할 수 있습니다 새 값보다 정의되고 높은 (또는 낮은)

이렇게 프로그램을 다시 작성합니다.

use strict; 
use warnings; 

my @items; 
my ($sum, $max, $min); 

while (my $num = <STDIN>) { 
    chomp $num; 
    last unless $num =~ /\S/; 

    $max = $num unless defined $max and $max >= $num; 
    $min = $num unless defined $min and $min <= $num; 
    $sum += $num; 
    push @items, $num; 
} 

print 'Entered numbers are: ', join(', ', @items), "\n"; 
print "Sum of all numbers is: $sum\n"; 
print "Minimum number is: $min\n"; 
print "Maximum number is: $max\n"; 
+0

나는'unless'가 선호되는 장소가있을 것이라고 확신합니다. 그러나 여기에서 사용하는 것은 단지 가려움을줍니다. 다음은 논리적으로 나에게 더 많이 읽는다.'$ max = $ num if!정의 된 최대 $ || $ num> $ max; – Miller

2

실행 유지합니다. 또한 '\n'은 입력되지 않으므로 특수 문자를 사용하려면 큰 따옴표 "\n"을 사용해야합니다.

루프는 보통 Ctrl + D으로 끝납니다.

또한 작업을 수행 할 모듈을 찾을 수 있습니다. while 루프가 종료 할 필요가 있기 때문에

#!/usr/bin/perl 
use warnings; 
use strict; 

use List::Util qw{ max min sum }; 

my @items = <>; 
chomp @items; 
my $max = max(@items); 
my $min = min(@items); 
my $sum = sum(@items); 

print "Entered numbers are: @items\n"; 
print "Sum of all numbers is: $sum\n"; 
print "Minimum number is: $min\n"; 
print "Maximum number is: $max"; 
+0

나는이 프로그램을 작성하는 데 OP의 의도가 기본적인 Perl을 연습하는 것이라고 믿기 때문에 List :: Util을 사용하면 그 점을 패배시킨다. 그러나 끝없는 반복 문제의 해결책이 자리 잡고 있습니다. +1 – Borodin

관련 문제