【发布时间】:2012-07-25 14:13:24
【问题描述】:
我正在编写一个 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)。在上面的代码和下面的代码之间,除了 cmets 什么都没有
$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] 除了上面显示的两个地方外,从未被触摸过。
对不起,如果这措辞很糟糕,或者没有意义。我尽力解释了困扰我几个小时的事情。
谢谢!
【问题讨论】:
标签: arrays perl hashmap conditional-statements