私は外部プログラムからデータを解析し、それを配列に保存しているPerlプログラムを持っています。ただし、データの一部が保存されておらず、後で検索しようとすると空白に戻ります。Perl配列にすべての変数が保存されていません
はここ@packetData
として伝わってくるデータを解析するコード、です:
if(@packetData[0] ne ""){
if(!$detectedClient{"@packetData[0]"}) {
my $rawSignal = average(@packetData[2]);
my $distance = 10**((27.55-(20*logten(2437))+abs($rawSignal))/20);
my @newClient = ($rawSignal, # Signal (dBm)
1, # Count
@packetData[0], # Source MAC
time(), # Last seen
$distance); # Distance (m)
$detectedClient{"@packetData[0]"} = [@newClient];
$uniqueClient++;
print "++ New probe request from @packetData[0] [$rawSignal dBm, $distance m]\n";
} else {
$detectedClient{"@packetData[0]"}[1]++;
$detectedClient{"@packetData[0]"}[3] = time();
}
}
がprint
文が信号との距離は罰金示しているが、以下のコードは与えてdetectedClient
配列からそれを表示しようとすることはできます空白:
for $key2 (keys %detectedClient) {
#Signal, Count, MAC, Time
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($detectedClient{$key2}[3]);
my $lastSeen = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
print STDOUT sprintf("!! %-20s %10s %-20s\n", $detectedClient{$key2}[2], $detectedClient{$key2}[1], $lastSeen, $detectedClient{$key2}[0], $detectedClient{$key2}[4]);
}
これは何が起こっているのですか?
常にuse strictを使用してください。警告qw(すべて)を使用する; '! – ikegami
私はスクリプトの先頭に両方を持っていますが、わかりやすくするために(スクリプトの残りの部分とともに)省略しました。 – CyberJacob
@CyberJacob: '警告を使用する 'があれば、' Scalar value @packetData [ 0]は$ packetData [0] 'と書かれています。どうしてそんなことをするのか? – Borodin