如果未定义数组中的所有元素,如何对数组进行排序?
my @names;
$names[0] = "andrei";
$names[1] = "serghei";
$names[7] = "valerii";
$names[10] = "alexandr";
@names = sort @names; # aint working.
我向大家道歉,我只是不知道如何在这里正确发布问题。我尝试了常见问题,我只是不明白。
答案 0 :(得分:6)
undef
lower 比任何非空字符串都要低,这就是为什么它在开头排序。你可能想要的是一个“清理”的结果数组,删除了所有undef
个元素?如果是这样,请点击这里:
#!/usr/bin/perl
use strict;
use Data::Dumper;
my @names;
$names[1] = 'alpha';
$names[3] = 'gamma';
$names[10] = 'beta';
@names = sort grep { defined } @names;
print Dumper(\@names);
# $VAR1 = [
# 'alpha',
# 'beta',
# 'gamma'
# ];
答案 1 :(得分:5)
要摆脱未定义的元素并对其余元素进行排序:
sort grep defined, @names
将未定义的元素放在开头:
sort { !defined($a) && !defined($b) ? 0
: !defined($a) ? -1
: !defined($b) ? +1
: $a cmp $b
} @names
将未定义的元素放在末尾:
sort { !defined($a) && !defined($b) ? 0
: !defined($a) ? +1
: !defined($b) ? -1
: $a cmp $b
} @names
答案 2 :(得分:2)
一个简单的单行打印阵列,包括间隙:
print join "\n", @names;
或者,如果您想将'undefined'值放在:
中print join "\n", map {$_ || "undef"} @names;
如果您想修剪未定义的值,请在答案中使用{em> ukautz 作为grep
。
print join "\n", grep {defined} @names;
您可以使用相同的方法获取有效索引:
@idx = grep {defined $names[$_]} keys @names;
如果您想对已定义的值进行排序,然后将它们插回到定义的位置,则可以使用上述内容。有点像就地排序。
@sorted = grep {defined} sort @names;
map {$names[$idx[$_]] = $sorted[$_]} keys @sorted;
答案 3 :(得分:0)
use strict;
use warnings;
use autodie;
use feature qw(say);
my @names;
$names[0] = "andrei";
$names[1] = "serghei";
$names[7] = "valerii";
$names[10] = "alexandr";
@names = sort grep { defined } @names;
for my $name ( @names ) {
say $name;
}
grep { defined }
获取@names
并从@names
中移除所有未定义的值。
如果您不想删除未定义的内容,可以执行以下操作:
#! /usr/bin/env perl
#
use strict;
use warnings;
use autodie;
use feature qw(say);
my @names;
$names[0] = "andrei";
$names[1] = "serghei";
$names[7] = "valerii";
$names[10] = "alexandr";
no warnings qw(uninitialized);
@names = sort @names;
use warnings qw(uninitialized);
for my $name ( @names ) {
say $name if defined $name;;
}
no warnings qw(initialized);
将关闭未初始化的警告。我知道我会因为使用sort
进行单位调整而遇到麻烦,所以我只需关闭未初始化的警告,然后在sort
之后立即将其重新打开。