首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl排序数组:保留以#开头的项

perl排序数组:保留以#开头的项
EN

Stack Overflow用户
提问于 2018-01-22 23:13:54
回答 2查看 128关注 0票数 4

有没有办法修改任何以#开头的字符串被忽略的排序,也就是保留它的索引?

例如:

代码语言:javascript
复制
my @stooges = qw(
        Larry
        Curly
        Moe
        Iggy
    );

my @sorted_stooges = sort @stooges;

@sorted_stooges应该提供:

代码语言:javascript
复制
Curly
Iggy
Larry
Moe

现在,如果我将#添加到Curly

代码语言:javascript
复制
my @stooges = qw(
            Larry
            #Curly
            Moe
            Iggy
        );

my @sorted_stooges = sort @stooges;

我希望@sorted_stooges是:

代码语言:javascript
复制
Iggy
#Curly
Larry
Moe
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-22 23:18:46

就地解决方案:

代码语言:javascript
复制
my @indexes_to_sort = grep { $array[$_] !~ /^#/ } 0..$#array;
my @sorted_indexes = sort { $array[$a] cmp $array[$b] } @indexes_to_sort;
@array[@indexes_to_sort] = @array[@sorted_indexes];

代码语言:javascript
复制
my @indexes_to_sort = grep { $array[$_] !~ /^#/ } 0..$#array;
@array[@indexes_to_sort] = sort @array[@indexes_to_sort];

代码语言:javascript
复制
my $slice = sub { \@_ }->( grep { !/^#/ } @array );
@$slice[0..$#$slice] = sort @$slice;

(不幸的是,@$slice = sort @$slice;不起作用,-It替换了@$slice的元素,而不是赋值给它们-但找到了一个合适的替代方案。)

票数 10
EN

Stack Overflow用户

发布于 2018-01-22 23:21:41

提取需要排序的元素,然后用排序后的元素更新原始数组:

代码语言:javascript
复制
my @stooges = qw( Larry #Curly Moe Iggy );
my @sorted_items = sort grep { not /^#/ } @stooges;
my @sorted_stooges = map { /^#/ ? $_ : shift @sorted_items } @stooges;
say for @sorted_stooges;

在他们的回答中,@ikegami提出了这种方法的一种变体,即提取要排序的元素的索引,而不是提取元素本身。该解决方案允许数组元素与列表切片进行优雅的交换。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48384733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档