1

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

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

@names = sort @names; # aint working.

抱歉,伙计们,我只是不知道如何在此处正确发布问题。我尝试了常见问题解答,我只是不明白。

4

4 回答 4

6

undefwill低于任何非空字符串,这就是它在开始时排序的原因。您可能想要的是一个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'
# ];
于 2013-09-03T23:16:29.383 回答
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
于 2013-09-04T01:13:51.993 回答
2

一种简单的单行打印阵列,包括间隙:

print join "\n", @names;

或者,如果您想将“未定义”值放入:

print join "\n", map {$_ || "undef"} @names;

如果您想修剪未定义的值,请grep按照ukautz在他的回答中建议的方式使用。

print join "\n", grep {defined} @names;

您可以使用相同的方法来获取有效索引:

@idx = grep {defined $names[$_]} keys @names;

如果您想对定义的值进行排序,然后将它们重新插入定义的位置,则可以使用上述方法。有点像就地排序。

@sorted = grep {defined} sort @names;
map {$names[$idx[$_]] = $sorted[$_]} keys @sorted;
于 2013-09-03T23:46:43.990 回答
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.

于 2013-09-04T02:54:48.793 回答