如果没有定义数组中的所有元素,如何在Perl中对数组进行排序?

时间:2013-09-03 23:03:41

标签: arrays perl sorting

如果未定义数组中的所有元素,如何对数组进行排序?

my @names;
$names[0]  = "andrei";
$names[1]  = "serghei";
$names[7]  = "valerii";
$names[10] = "alexandr";

@names = sort @names; # aint working.

我向大家道歉,我只是不知道如何在这里正确发布问题。我尝试了常见问题,我只是不明白。

4 个答案:

答案 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之后立即将其重新打开。