Сравнение файлов с ленты и диска с использованием MD5 с perl archive::tar завершается ошибкой
Мы хотим создать отчет с проверками MD5 между архивом tar на ленте и файлами на диске. Я создал сценарий, который должен делать это, но он работает правильно, используя файл tar, но он терпит неудачу при использовании tar на ленте. Тар был записан с помощью GNU tar на ленту.
use strict;
use warnings;
use Archive::Tar;
use Digest::MD5 qw(md5 md5_hex md5_base64);
my $tarfile = '/dev/rmt/1';
my $iter = Archive::Tar->iter( $tarfile, 1, {md5 => 1} );
print "------------ TAR MD5 ----------- ----------- FILE MD5 ----------- ----- File -----\n";
while( my $f = $iter->() ) {
if ($f->is_file != 0) {
my $tarMd5 = md5_hex( $f->get_content);
my $filename = $f->full_path;
my $fileMd5 = '';
if (-e $filename) {
open(HANDLE, "<", $filename);
$fileMd5 = md5_hex(<HANDLE>);
} else {
$fileMd5 = "!!!!!!! FILE IS MISSING !!!!!!!!";
}
if ($tarMd5 eq $fileMd5) {
print "$tarMd5 <--> $fileMd5 --> $filename\n";
} else {
print "$tarMd5 ><>< $fileMd5 --> $filename\n";
}
}
}
Как уже говорилось, он работает правильно при использовании tar-файла на основе файла, но при использовании tar на ленте мы получаем ошибку:
Использование неинициализированного значения в записи подпрограммы в строке 12. check_archive.pl. Невозможно использовать строку ("") в качестве ссылки на подпрограмму, в то время как "строгие ссылки" используются в строке 12. check_archive.pl. Мой $f не определен.
1 ответ
Использование неинициализированного значения в записи подпрограммы в строке 12. check_archive.pl. Невозможно использовать строку ("") в качестве ссылки на подпрограмму, в то время как "строгие ссылки" используются в строке 12. check_archive.pl. Мой $f не определен.
if ($f && $f->is_file != 0) {## NOT AN IMPORTANT WARNING...
...
if (-e $filename) { ## CHECK IF FILE EXISTS
local $/=""; ## <= JUST ADD THIS FOR INSTANT OUTPUT (NO BUFFER)
open(HANDLE, "<", $filename); ## CREATE A FILE HANDLE TO READ A FILE
$fileMd5 = md5_hex(<HANDLE>); ## SEND HANDLE TO THE MD5 FUNCTION
}
...