Считать записи в хэше и как часто они меняются

У меня есть скрипт, который читает сигналы шины CAN и отображает их на экране, но мне нужно добавить счетчик сигналов и частоту.

Поэтому мне нужно посчитать, сколько раз этот $id появлялся до сих пор и сколько миллисекунд назад он добавлял в хеш-таблицу.

#!/usr/bin/perl -w

use strict;

open my $can_bus, "./receivetest |"
    or die "Couldn't read from CAN bus: $!";

my %last_value;
while (<$can_bus>) {
   if( /^(........:...) (........) (.*)$/ )
   {

        my ($something, $id, $payload) = ($1,$2,$3);
        $last_value{ $id } = $payload;

        system('clear'); #clear screen

        #Print Table
        for my $id (sort keys %last_value) {
            print "$id\t $last_value{ $id }\n";
            }
    }
    else {
        warn "ignore unknown line: ";
        warn $_;
    }
}

Это мой код до сих пор.

1 ответ

Вы можете хранить разные значения для одного $id ключ, если вы расширите свой хэш, добавив больше ключей после $id ключ. Например:

if (defined $last_value{ $id } ){

    $last_value{ $id }{COUNT} += 1;

    my $time_diff = $now_milli - $last_value{ $id }{TIME};

    $last_value{ $id }{TIME}     = $now_milli;
    $last_value{ $id }{DIFF}     = $time_diff;
    $last_value{ $id }{PAYLOAD}  = $payload;

}else{

    $last_value{ $id }{TIME}     = $now_milli;
    $last_value{ $id }{DIFF}     = "NA";
    $last_value{ $id }{COUNT}    = 1;
    $last_value{ $id }{PAYLOAD}  = $payload;

}

Чтобы узнать текущее время в миллисекундах, вы можете использовать Time::HiRes qw/gettimeofday/ которая является частью ядра Perl:

use Time::HiRes qw/gettimeofday/;

my $now_milli = 1000 * gettimeofday();

Наконец, для печати информации, хранящейся в %last_value хэш:

foreach my $id (keys %last_value){

    print "ID: ", $id, "\n";

    print "Count: ",          $last_value{$id}{COUNT},   "\n";
    print "Time from last: ", $last_value{$id}{DIFF},    "\n";
    print "Payload: ",        $last_value{$id}{PAYLOAD}, "\n";

}
Другие вопросы по тегам