代码之家  ›  专栏  ›  技术社区  ›  Igor Dvorzhak

排序存档:就地压缩成员

  •  1
  • Igor Dvorzhak  · 技术社区  · 6 年前

    我需要使用Perl对数组成员进行就地排序,但如果不使用 Data::Alias 如上所述 this 回答。

    如果没有默认不包含在Debian发行版中的其他Perl库,是否可以实现这一点?

    代码:

    use Archive::Zip;
    use feature qw(say);
    
    my $zip = Archive::Zip->new();
    $zip->read("<PATH_TO_ZIP>");
    
    my $members_ref = $zip->{'members'};
    my @members = @$members_ref;
    
    # Not sorted 1st member:
    say @members[0]->fileName();
    
    @members = sort { $b->fileName() cmp $a->fileName() } @members;
    
    # Sorted 1st member:
    say @members[0]->fileName();
    
    # Should be sorted 1st member if sorted in-place:
    say @{$zip->{'members'}}[0]->fileName();
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Corion    6 年前

    我不明白你的问题。当然,如果对数组引用进行排序,则可以就地对数组引用进行排序。在程序中,创建数组的副本,并对该数组进行排序。原始数组保持未排序状态。

    以下程序消除了阵列拷贝,并为我工作:

    #!perl
    use strict;
    use warnings;
    use Archive::Zip;
    use feature qw(say);
    
    my $zip = Archive::Zip->new();
    $zip->read("Q:/cygwin_tools.zip");
    
    my $members_ref = $zip->{'members'};
    
    # Not sorted 1st member:
    say $members_ref->[0]->fileName();
    
    @$members_ref = sort { $b->fileName() cmp $a->fileName() } @$members_ref;
    
    # Sorted 1st member:
    say $members_ref->[0]->fileName();
    
    # Should be sorted 1st member if sorted in-place:
    say @{$zip->{'members'}}[0]->fileName();
    
    __END__
    cygwin/
    cygwin/usr/share/bison.simple
    cygwin/usr/share/bison.simple
    

    也见

    perlreftut

    References Quick Reference