![](/img/trans.png)
[英]perl - how do you extract all elements of an array except the last?
[英]How do I sort an array in Perl if not all of the elements in the array are defined?
如果未定義數組中的所有元素,如何排序數組?
my @names;
$names[0] = "andrei";
$names[1] = "serghei";
$names[7] = "valerii";
$names[10] = "alexandr";
@names = sort @names; # aint working.
抱歉,我只是不知道如何在此處正確發布問題。 我嘗試了常見問題解答,但我沒有。
undef
將低於任何非空字符串,這就是為什么它會在開始時進行排序的原因。 您可能想要的是一個“清除”結果數組,其中刪除了所有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
后立即將其重新打開即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.