在perl中查找最小元素时出错

在perl中查找最小元素时出错,perl,Perl,我试图在perl中获取元素数组中的最小和最大元素,每件事情都很正常,但最小元素没有打印出来: @array1=(); $i=0; $array1[$i]=<STDIN>; $sum=$minimum=$maximum=$array1[$i]; while($array1[$i]!=" ") { $i=$i+1; $array1[$i]=<STDIN>; $sum=$sum+$array1[$i]; if($array1[$i]>$ma

我试图在perl中获取元素数组中的最小和最大元素,每件事情都很正常,但最小元素没有打印出来:

@array1=();
$i=0;
$array1[$i]=<STDIN>;
$sum=$minimum=$maximum=$array1[$i];
while($array1[$i]!=" ")
{
    $i=$i+1;
    $array1[$i]=<STDIN>;
    $sum=$sum+$array1[$i];
    if($array1[$i]>$maximum)
    {
        $maximum=$array1[$i];
    }
    if($array1[$i]<$minimum)
    {
        $minimum=$array1[$i];
    }
    if($array1[$i]==" ")
    {
        last;
    }
}
print("Entered numbers are : ",@array1);
print("Sum of all numbers is : ",$sum);
print "\n";
print("Minimum number is : ",$minimum);
print "\n";
print("Maximum number is : ",$maximum);
@array1=();
$i=0;
$array1[$i]=;
$sum=$minimum=$maximum=$array1[$i];
而($array1[$i]!=“”)
{
$i=$i+1;
$array1[$i]=;
$sum=$sum+$array1[$i];
如果($array1[$i]>maximum美元)
{
$maximum=$array1[$i];
}

如果($array1[$i]考虑在循环中输入空格时会发生什么。将其分配给$array1[$i]。然后检查最小值和最大值。因此,如果有字符串并进行数字比较,如果可以,它会将该字符串转换为数字(例如“12”是12)。如果有非数字的字符串(例如空格)然后将其转换为0

我怀疑您键入的是正数,因此当您输入空格时,最小值的if条件为true,空格置于最小值中。如果您输入负数,它将用代码打印出负数

如果您在阅读项目后和进行检查之前将检查移动到,以查看是否已完成,则可能效果会更好,并且您不会进行比较,因为您实际上不需要进行任何比较/分配,因为您已完成并且条目不是数字。

只需移动此项:

if($array1[$i]==" ")
{
        last;
}
到循环块的开头

代码的简化版本:

use strict;
use warnings;

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

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

    $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 );
使用严格;
使用警告;
我的@items;
我的($sum,$max,$min);
while(chomp(my$num=)){
最后一个if($num eq');
下一个if($num eq');
$max | |=$num;
$min | |=$num;
$sum+=$num;
$max=$num如果($num>$max);
$min=$num如果($num<$min);
推送(@items,$num);
}
printf(“输入的数字是:%s\n”,join(',',@items));
打印(“所有数字的总和为:”,$Sum);
打印“\n”;
打印(“最小数量为:”,$min);
打印“\n”;
打印(“最大数量为:”,$max);

始终使用
使用严格;使用警告;
使用严格;
将在其他错误中查找未使用
my
声明的变量。
使用警告;
将查找您询问的错误。在检查是否获得值之前,您尝试处理读取的最后一个值-始终是错误的移动。很可能undef比较低。@JonathanLeffler我觉得在OP添加
use strict;
use warnings
并修复那些pragmas将报告的所有内容之前,解决脚本中所有错误的问题都是不值得的。只要看一眼,我就可以看到他使用
=
而不是
eq
,但是
警告
w我知道我必须在我的代码中使用“use strict;use warnings;”,并进行了相应的更改,但现在我遇到了另一个问题,即我无法停止循环。如果用户输入新行字符,我想停止循环(enter).那么请帮忙me@user3453803:请发布另一个问题,而不是在comments@Borodin当前位置我实际上是在问所谓的问题的答案,这不是一个新问题。我没有得到答案expected@user3453803:您最初写道:“一切正常,但最基本的元素没有打印出来”现在你说,“我知道我必须在我的代码中使用”use strict;use warnings;”并相应地更改,但现在…我无法停止我的循环”。这意味着您正在问一个不同的问题,并且您的代码已更改。请打开一个新问题。它没有打印最小元素是,因为空间被评估为0是,它的工作是否可以请您更改它,即如果我输入“enter”,循环必须停止,然后将
next if($num eq')
更改为
last if($num eq'))
当您只需按enter键时,这将停止。它不能正确处理零。如果您先输入零,则下一个值将替换它。因此
0
100
导致错误的最小值,而
0
-42
导致错误的最大值。