我正在编写一个 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;' 语句,打印语句将打印 '19700101' 日期并且一切正常运行。发生了什么? $SCAN{$key}[1] 除了上面显示的两个地方外,永远不会被触及。
对不起,如果这措辞很糟糕,或者没有意义。我尽力解释了困扰我几个小时的事情。
谢谢!