首页 > 解决方案 > Perl:强制按数字顺序散列

问题描述

我正在尝试按记录号顺序显示哈希数据(即按哈希键排序)。我已将记录存储在带有关联记录号的哈希中。

我在这里做错了什么?

这是一些显示问题的类似代码

#!/usr/bin/env perl
use strict;
use Time::HiRes;

my $rec = {};
my %Data;
my $recno = 1;

while ($recno <= 100) {
   $rec->{recno} = $recno;
   $rec->{dt} = qx/date/;

   $Data{ $rec->{recno} } = $rec;

   # Initialize
   Time::HiRes::sleep(0.2);
   $recno++;
   $rec = {};
}

my $count = keys %Data;
print "Found $count records\n";

foreach my $rec (sort { $Data{$a} <=> $Data{$b} } keys %Data) {
#foreach my $rec (sort { $Data{$a} cmp $Data{$b} } keys %Data) {
  print "   Rec No: --".$rec."--\n";
  print "     Date: ". $Data{$rec}{dt}."\n";
}

有时它会按顺序显示哈希,有时则不会。有点与它看起来的记录数量有关。

Found 100 records
   Rec No: --1--
     Date: Thu Feb 13 15:19:46 UTC 2020

   Rec No: --31--
     Date: Thu Feb 13 15:19:52 UTC 2020

   Rec No: --32--
     Date: Thu Feb 13 15:19:52 UTC 2020

   Rec No: --33--
     Date: Thu Feb 13 15:19:52 UTC 2020

   Rec No: --34--
     Date: Thu Feb 13 15:19:52 UTC 2020

   Rec No: --35--
     Date: Thu Feb 13 15:19:52 UTC 2020

   Rec No: --36--
     Date: Thu Feb 13 15:19:53 UTC 2020

标签: arraysperlsortinghashnumeric

解决方案


您正在比较值,但您需要比较键:

for my $rec (sort { $a <=> $b } keys %Data) {

推荐阅读