perl: 读取标准输入,找出输入中拥有最大的数字的一行

如果输入为:I✀m 135 this is 2000 11 2 3那么输出的就是: 5 this 2000 1请问这个程序怎么写,以及我不太了解sort函数,可以麻烦解释一下吗。最好注释多一点, 谢谢!
2026年09月23日 16:59
有2个网友回答
网友(1):

要实现你的要求,需要把输入的数据按行存入数组,然后把句子按空格切分成单词,把单词中的数字用正则表达式匹配出来与最大值比较,最后输出最大值所在行.

用sort函数,因为有数字又有字符,所以比较不方便,不如自定义比较.

完整的Perl程序如下(每行都加了注释)

@arr=();#定义一个空数组

while(defined($line = )){#从标准输入设备读取一行赋给$line,直到最后一行

push(@arr,$line);#把读取的一行压入数组

}

$max=0;#定义最大值变量,并赋初值0

$maxi=0;#定义最大值所在行变量,并赋初值0

for($i=0;$i<@arr;$i=$i+1){ #for_i循环遍历每行数据

@num=split(/ +/,$arr[$i]);#把每行数据按空格切分成单词

for($j=0;$j<@num;$j=$j+1){#for_j循环遍历每行数据的每个单词

$s=$num[$j];#把切分出来的单词赋给临时变量$s

if($s=~ m/[0-9]+/){ #用正则表达式匹配数字,如果有赋给$s

if($max<$s){ #如果数字大于最大值

$max=$s; #把最大值赋给$max

$maxi=$i;#把最大值所在行号赋给$maxi

}

}

}

}

print @arr[$maxi];#打印最大值所在行的数据

源代码

网友(2):

$str = <we uu
I'm 13
5 this is 2000 1
1 2 3
wwww 1000
TXT

@SS = split/\n/,$str;#以换行符分割输入的内容
@S = map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map{[$_,(sort{$b <=> $a}(grep{/\d+/}(split/\s+/,"$_ 0")))[0]]}@SS;
print"$S[0]\n";
# split/\s+/,"$_ 0"每行后面加个0
#grep{/\d+/} 搜索数字
#sort{$b <=> $a}从大到小排列
#map{[$_,和每行最大的数组成一个多维数列
# sort { $b->[1] <=> $a->[1] }按多维数组的第二个元素(即每行的最大数)进行排列
# map { $_->[0] }多维数组的第一个元素组成一个数组
#$S[0]就是最大数所在的行。