当输入空行时,Perl while循环不会退出

时间:2014-05-18 04:44:35

标签: arrays perl

我正在尝试打印数字列表的总和,最大值和最小值,但我正在努力使其正常工作。

当我按Enter键时,循环应退出但程序仍在运行

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 )

2 个答案:

答案 0 :(得分:2)

如果您想检测 Enter ,您之前无法chomp输入。此外,'\n'不是输入,您必须使用双引号"\n"来启用特殊字符。

while (<>)循环通常以 Ctrl + D 结束。

此外,您可以找到一个模块来为您完成工作。

#!/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";

答案 1 :(得分:2)

  • 您不能在chomp条件中使用while,如此

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

    因为while循环需要在<>在文件末尾返回undef时终止。因此,您必须将chomp作为循环的第一个语句

  • 退出这样的循环的最简单方法是使用正则表达式/\S/

  • 检查输入是否包含任何非空格字符
  • 支票

    last if ( $num eq '\n' )
    

    将无效,因为您已使用chomp从输入中删除换行符。此外,如果您使用单引号'\n',则双字符字符串\后跟n。您需要使用"\n"等双引号来创建换行符

  • 首次声明标量变量时,它的值为undef,因此您可以通过测试并更新$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";