2014-09-03 38 views
1

我們希望創建一個報告,其中包含磁帶上的tar歸檔文件和磁盤上的文件之間的MD5檢查。我創建了一個應該執行此操作的腳本,但它使用tar文件正常工作,但在磁帶上使用tar時失敗。 tar用gnu tar寫入磁帶。使用MD5將磁帶和磁盤中的文件與perl archive :: 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文件的時候,但在磁帶上使用焦油,當我們得到錯誤的原理正確:

Use of uninitialized value in subroutine entry at check_archive.pl line 12. Can't use string ("") as a subroutine ref while "strict refs" in use at check_archive.pl line 12. my $f is not defined.

+0

穿上'打印 「OBJ:[$ F] \ n」;''裏面while'。 – 2014-09-03 08:42:14

+0

它永遠不會進入這個時代的內部。添加該行不顯示任何輸出。 我們加了 '$ Archive :: Tar :: WARN = 1; $ Archive :: Tar :: DO_NOT_USE_PREFIX = 1;' 但是目前我們不再發生錯誤,但它仍然不讀取磁帶。 – Ronald 2014-09-03 14:23:11

回答

0

在check_archive.pl子程序入口使用未初始化值第12行。在check_archive.pl第12行使用「strict refs」時,不能使用字符串(「」)作爲子程序ref。我的$ 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 
} 

...

+1

請問您可以在[編輯]多一點解釋爲什麼這段代碼回答這個問題?僅限代碼答案[阻止](http://meta.stackexchange.com/q/148272/274165),因爲他們沒有教導解決方案。 – 2015-06-15 01:33:13