my @str = qw /(I) (II) (XIII) (IV)/;
my @max = map { my $len=0; if(length($_)>$len){ $len = length($_);} } @str;
print $max;
输出为(XIII)
,长度为5
;
请您纠正我在上述代码中出错的地方。
答案 0 :(得分:4)
要回答标题中的问题,清洁选项是将其委托给List::Util::max
:
use List::Util 'max';
print max map { length } @str;
问题中的代码段问题是$len
是map
块的每次迭代的本地问题,因此有效地将其重置为零六次。最终结果是$len
将与@str
中最后一项的长度相对应,这就是为什么它没有达到您对它的期望。你可以做
my $len=0;
my @max = map { $len = length if $len < length } @str;
print $len;
但如果您没有有意义地将@max
用于其他任何事情,那就太糟糕了。
答案 1 :(得分:2)
我想你想找到数组@str
中最长元素的字符串长度。
你的问题是map
没有按照你的想法行事。它迭代@str
的元素并对每个元素应用修改。它返回已修改元素的列表。您将该列表分配给标量变量$max
。 Perl中标量上下文中的列表将转换为该列表中元素的数量,因此您获得4
。
你想要的是一个for
循环。
my @str = qw /(I) (II) (XIII) (IV)/;
my $max = 0;
for (@str) {
$max = length($_) if length($_) > $max;
}
print $max;
这将打印6
,这是(XIII)
的正确长度。
(XIII)
123456
答案 2 :(得分:2)
您可以使用List::Util::reduce
代替map
,以避免创建不必要的长度列表:
use strict;
use warnings;
use List::Util qw/reduce max/;
my @str = qw /(I) (II) (XIII) (IV)/;
my $max = reduce { max($a, length($b)) } 0, @str;
print $max;