perl -尝试根据值排序'hashes'数组

l7wslrjt  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(186)

我用文件详细信息值填充一个数组,如下所示:

push(@local_files,{fname=>$bname, fdate=>$lfdate, fsize=>$lfsize});

然后尝试根据“fname”降序对这些文件进行排序,如以下示例和许多其他示例所示:

my @sorted=sort { $b->{'fname'} <=> $a->{'fname'} } \@local_files;

my @sorted=sort { $local_files['fname']{$b} cmp $local_files['fname']{$a} } @local_files;

我尝试过的任何方法都无法排序此数组,这就是我需要帮助的地方。
但是使用dumper我可以看到值存储在数组中

foreach my $whatever(@sorted){
        ## this works to dump contents of whatever
        print Dumper(\$whatever);

}

输出如下(片段):

{
              'fdate' => '88.837662037037',
              'fname' => 'Testfile997.txt',
              'fsize' => 4415
            },
            {
              'fdate' => '88.837662037037',
              'fname' => 'Testfile998.txt',
              'fsize' => 4415
            },

最后我希望能够按存储的3个值中的任何一个进行排序,但多次搜索都没有用。任何帮助都将不胜感激-谢谢

kuhbmx9i

kuhbmx9i1#

你第一次差点就成功了。正确:

my @sorted = sort { $b->{ fname } cmp $a->{ fname } } @local_files;

您有一个遗漏的\,并且您执行的是数值比较而不是字符串比较(我删除了不需要的',但这并不重要)。
使用Sort-Key也可以很好地完成此操作。

use Sort::Key qw( rskeysort );

my @sorted = rskeysort { $_->{ fname } } @local_files;

请注意,如果您有Testfile99(而不是Testfile099)和Testfile100(因为91之后),则上述两种排序方式都会有问题。使用自然排序方式可以解决这个问题。

use Sort::Key::Natural qw( rnatkeysort );

my @sorted = rnatkeysort { $_->{ fname } } @local_files;

我希望能够按存储的3个值中的任何一个进行排序

use Sort::Key::Natural qw( rnatkeysort );

my %sorters = (
   by_fname_desc => sub { rnatkeysort { $_->{ fname } } @_ },
   ...
);

my $order = "by_fname_desc";  # Or whatever

my $sorter = $sorters{ $order }
   or die( "Unknown order `$order`" );

my @sorted = $sorter->( @local_files );

相关问题