Perl меняет значение в условном выражении перед входом в него?

Я работаю над 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";

Теперь причина, по которой я считаю, что значение изменяется перед входом в цикл, заключается в том, что я добавляю оператор «print $lastScanned» прямо перед «if (($date...){' дата напечатала все, что было назначено $date ранее -, но если я закомментирую '$SCAN{$key}[1] = $date;' оператора, операторы печати будут печатать дату «19700101», и все будет работать так, как должно. Что происходит? $SCAN{$key}[1] никогда не трогается, за исключением двух мест, показанных выше.

Извините, если это очень плохо сформулировано или не имеет смысла. Я изо всех сил старался объяснить то, что ставило меня в тупик в течение нескольких часов.

Благодарю вас!

5
задан Zachary Yamada 26 July 2012 в 21:58
поделиться