Perl: сила га sh в порядке нумерации c - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь отобразить данные ha sh в порядке номеров записей (то есть отсортированы по ключам ha sh). Я сохранил записи в ха sh с соответствующим номером записи.

Что я здесь не так делаю?

Вот некоторый похожий код, который показывает проблему

#!/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";
}

Иногда отображает ха sh по порядку, иногда нет. Отчасти связано с количеством записей, на которые это похоже.

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

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Вы сравниваете значения, но вам нужно сравнить ключи:

for my $rec (sort { $a <=> $b } keys %Data) {
1 голос
/ 13 февраля 2020

См. Ответ @choroba для решения проблемы, как вы ее сформулировали.

Но чтобы проблема не возникла в первую очередь, выберите оптимальную структуру данных для задачи . В этом случае нужен массив, а не ха sh. Я также использовал более описательные имена переменных и строчные идентификаторы (см. Конвей (2005)).

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

my $delay = 0.2;
my $num_dates = 100;
my @dates;

for ( 0 .. ($num_dates - 1) ) {   
   chomp( my $date = `date` );
   push @dates, $date;
   Time::HiRes::sleep($delay);
}

for ( 0..$#dates ) {
    print join( "\t", $_, $dates[$_] ), "\n";
}

СПРАВКА:

Дамиан Конуэй. (2005) Perl Лучшие практики: стандарты и стили для разработки поддерживаемого кода. О'Рейли Медиа: http://shop.oreilly.com/product/9780596001735.do

0 голосов
/ 13 февраля 2020

Слегка исправленный код дает ожидаемый результат.

ПРИМЕЧАНИЕ: date в Windows требуется опция /T в противном случае он ожидает ввода пользователя

use strict;
use warnings;
use feature 'say';

use Time::HiRes;

my $debug = 0;                  # debug flag

my %Data;
my($rec_id,$record);            # declared here for format
my $num_records = 100;          # define number of records

foreach my $recno (1..$num_records) {
    say "Record: $recno" if $debug;

    my $rec = {};

    $rec->{recno} = $recno;
    $rec->{dt} = qx/date \/T/;  # /T required for Windows 

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

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

my $count = keys %Data;
say  "Total $count records";

$~ = 'STDOUT_HEAD';
write;
$~ = 'STDOUT';

foreach $rec_id (sort { $a <=> $b } keys %Data) {
    $record = $Data{$rec_id}{dt};
    write;
}

$~ = 'STDOUT_BOTTOM';
write;

format STDOUT_HEAD =
+------+------------------------------+
| No.  | Record                       |
+------+------------------------------+
.

format STDOUT =
| @>>> | @<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$rec_id, $record
.

format STDOUT_BOTTOM =
+------+------------------------------+
.

Вывод

Total 100 records
+------+------------------------------+
| No.  | Record                       |
+------+------------------------------+
|    1 | Thu 02/13/2020               |
|    2 | Thu 02/13/2020               |
|    3 | Thu 02/13/2020               |
|    4 | Thu 02/13/2020               |
|    5 | Thu 02/13/2020               |
|    6 | Thu 02/13/2020               |
|    7 | Thu 02/13/2020               |
|    8 | Thu 02/13/2020               |
|    9 | Thu 02/13/2020               |
|   10 | Thu 02/13/2020               |
.......................................
.......................................
|   95 | Thu 02/13/2020               |
|   96 | Thu 02/13/2020               |
|   97 | Thu 02/13/2020               |
|   98 | Thu 02/13/2020               |
|   99 | Thu 02/13/2020               |
|  100 | Thu 02/13/2020               |
+------+------------------------------+
...