要实现你的要求,需要把输入的数据按行存入数组,然后把句子按空格切分成单词,把单词中的数字用正则表达式匹配出来与最大值比较,最后输出最大值所在行.
用sort函数,因为有数字又有字符,所以比较不方便,不如自定义比较.
完整的Perl程序如下(每行都加了注释)
@arr=();#定义一个空数组
while(defined($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];#打印最大值所在行的数据
源代码
$str = <
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]就是最大数所在的行。