2014-12-12 3 views
0

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

Так что мне нужно подсчитать, сколько раз этот $ 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

https://metacpan.org/pod/Time::HiRes –

ответ

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"; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^