如果未定义数组中的所有元素,如何对数组进行排序?
my @names;
$names[0] = "andrei";
$names[1] = "serghei";
$names[7] = "valerii";
$names[10] = "alexandr";
@names = sort @names; # aint working.
抱歉,伙计们,我只是不知道如何在此处正确发布问题。我尝试了常见问题解答,我只是不明白。
undef
will低于任何非空字符串,这就是它在开始时排序的原因。您可能想要的是一个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'
# ];
要摆脱未定义的元素并对其余元素进行排序:
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
一种简单的单行打印阵列,包括间隙:
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;
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
.