Считать записи в хэше и как часто они меняются
У меня есть скрипт, который читает сигналы шины 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";
}