在数组中如何使用perl检查列表元素的最大大小

时间:2017-07-13 10:00:42

标签: perl

my @str = qw /(I) (II) (XIII) (IV)/;
my @max = map { my $len=0; if(length($_)>$len){ $len = length($_);} } @str;
print $max;

输出为(XIII),长度为5;

请您纠正我在上述代码中出错的地方。

3 个答案:

答案 0 :(得分:4)

要回答标题中的问题,清洁选项是将其委托给List::Util::max

use List::Util 'max';
print max map { length } @str;

问题中的代码段问题是$lenmap块的每次迭代的本地问题,因此有效地将其重置为零六次。最终结果是$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;