2014-12-12 4 views
0

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

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

답변

1

$id 키 뒤에 추가 키를 추가하여 해시를 확장하면 $id 키에 대해 다른 값을 저장할 수 있습니다. 예를 들어 :

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

} 
다음 %last_value 해시에 저장된 정보를 인쇄 할 마지막

use Time::HiRes qw/gettimeofday/; 

my $now_milli = 1000 * gettimeofday(); 

:

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/을 사용할 수 있습니다 (밀리 초) 현재 시간을 얻으려면