簡體   English   中英

如果未定義數組中的所有元素,如何在Perl中對數組進行排序?

[英]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;

如果要修剪未定義的值,請使用grepukautz在其答案中建議的那樣。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM