我正在尝试打印数字列表的总和,最大值和最小值,但我正在努力使其正常工作。
当我按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 )
答案 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";