2017-04-07 160 views
0

我得到以下功能,并不知道如何将输出放入一个变量。比较文件和打印差异使用打印,除非

sub checkFiles { 
# Declaration 
my $origDir="/home/hbo/test/chksum/"; 
my $tmpDir="/home/hbo/test/tmp/"; 

# get directory inventory 
opendir(DIR, $origDir); 
my @files = sort (grep { !/^\.|\.\.}$/ } readdir(DIR)); 
closedir(DIR); 
foreach my $file (@files) { 
    if (!-r $origDir.$file) { print $origDir.$file, "does not exist"; next;} 

    # open filehandles 
    open my $a_fh, '<', $origDir.$file or die "$origDir.$file: $!"; 
    open my $b_fh, '<', $tmpDir.$file or die "$tmpDir.$file: $!"; 

    # map difference 
    my %tmpDirFile; 
    @tmpDirFile{map { unpack 'A*', $_ } <$b_fh>} =(); 

    # print difference 
    while (<$a_fh>) { 
    print unless exists $tmpDirFile{unpack 'A*', $_}; 
    } 
    close $a_fh; 
    close $b_fh; 
    } 
} 

我得到了问题的行是 “打印,除非存在$ {tmpDirFile解包 'A *',$ _};”我想把这个输出放入一个像数组这样的变量中,我可以在“更改”或“删除”或“新”之间做出决定。一个简短的总结我的脚本将做的事情:它构建一个目录的md5总和,检查目录是否与之前的版本不同,并用“新”,“删除”,“更改”等标志打印差异。是的,我不想使用额外的库。

在控制台上的输出是:

40567504a8a2f9f665695a49035b381b /home/hbo/test/somedir/some/some.conf 

现在我想说明,如果该文件已更改,删除或者是新的。因为这个,我需要把输出放入一个变量中。有人能帮我吗?

回答

0

你可以使用散列来做到这一点。这有点像计算,只是你不会简单计数,而是保留每个键的文件列表。它看起来像这样:

{ 
    new => [ 
     'file1', 
     'file3', 
    ], 
    deleted => [ 
     'file4', 
    ], 
    changed => ] 
     'file5', 
    ], 
}, 

创建哈希值(或在我的示例散列引用)的环的外侧,然后推入在相应的键阵列REF。你甚至不需要创建数组ref,autovivification将为你照顾。

my $diff; # we keep track here 
foreach my $file (@files) { 

# ... 

while (my $line = <$a_fh>) { 
     if (exists $tmpDirFile{unpack 'A*', $line}) { 
      # do stuff to check what the difference is 
      if (find_diff($line)){ 
       push @{ $diff->{changed} }, $line; 
      } else { 
       push @{ $diff->{deleted} }, $line; 
      } 
     } else { 
      push @{ $diff->{new} }, $line; 
     } 
    } 
}