私は、ネットワーク上のマシンのスキャンの自動化を支援する Perl スクリプトに取り組んでいます。私は本業のプログラマーではありませんが、それでもこのプロジェクトは私に割り当てられており、かなり当惑しています。私が困惑していることの性質を説明する前に、私がしていることの概要を説明させてください.
基本的に、このスクリプトは n 時間ごとに実行されます。実行すると、アクティブな IP のログを保持するファイルをチェックし、それらを DHCP ログと照合して、静的なものだけを選び出します。次に、これらはハッシュに入れられます (初期化フラグが付けられている場合は新しいもの、それ以外の場合は Storable を使用してロードされます)。キーは IP であり、配列内ではそれらの MAC [0] と「最後にスキャンされた」日付 [1] が最初に設定されます。 19700101. スクリプトの次の部分では、今日の日付と「最後にスキャンされた」日付の日付を比較し、特定のしきい値を下回っている場合は、スキャナーにクエリを送信します。
私が非常に迷っている問題は、日付がチェックされているときに、条件を入力する前に日付の値 (更新された「最後にスキャンされた」) が設定されているように見えることです。これは私にはありそうにないように思えますが、私が考えることができる唯一の可能性です。関連するコードのチャンクは次のとおりです。
IP/MAC をハッシュに追加するコード
if(init == 1){
%SCAN = ();
@data = ();
foreach $key (keys %IPS){
$unsavedDB = 1;
$data[0] = $IPS{$key};
$data[1] = 19700101;
print $data[1];
$SCAN{$key} = \@data;
}
}else{
#repeat of the above code, but with a if(exists...) to prevent duplicates from being added to the hash that is loaded via storables.
}
日付をチェックするコード (以前に設定されており、今日は 20120726 になります)。上記のコードと次のコードの間にはコメントしかありません
$scanned = 0;
foreach $key (keys %SCAN){
$lastScanned = $SCAN{$key}[1];
if(($date - $lastScanned) > $threshold){
$unsavedDB = 1;
$toScan = ${$key}[0];
#omitted data for security reasons, just basically forms a string to send to a scanner
$SCAN{$key}[1] = $date;
$scanned++;
}
}
print "finished. $scanned hosts queued\n";
さて、ループに入る前に値が変更されていると私が信じる理由は、「if(($date...){」の直前に「print $lastScanned」ステートメントを追加したときです。以前の $date に - しかし、'$SCAN{$key}[1] = $date;' ステートメントをコメントアウトすると、print ステートメントは '19700101' 日付を出力し、すべてが正常に機能します。 $SCAN{$key}[1] は、上記の 2 か所を除いて、まったく触れられていません。
これが非常に悪い言い回しであったり、意味をなさない場合は申し訳ありません。私は、何時間も頭を悩ませてきた何かを説明するために最善を尽くしました.
ありがとうございました!