2013-12-08 30 views
2

我在這裏檢查了這個鏈接的目錄從文件中比較MD5。我想要做的是採取這些MD5的,並與數組進行比較。這是我迄今爲止。在對一個陣列(perl的)

use warnings; 
use strict; 
use Digest::MD5 qw(md5_hex); 

my $dirname = "./"; 
opendir(DIR, $dirname); 
my @files = readdir(DIR); 
closedir(DIR); 

print "@files\n"; 

foreach my $file (@files) { 
    if (-d $file || !-r $file) { next; } 
    open(my $FILE, $file); 
    binmode($FILE); 
    print Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n"; 
    my @array = ('667fc8db8e5519cacbf8f9f2af2e0b08'); 
     if (@array ~~ $FILE) { 
      print "matches array", "\n"; 
     } else { 
      print "doesnt match array", "\n"; 
    } 
} 
system ('pause') 


但有了這個,我總是得到犯規匹配陣列無論它在陣列完全匹配。我可以print @array,它甚至會顯示相同的文件的MD5值。但就像我說的那樣,它總是說「不匹配數組」。 ive從來沒有讓它說任何文件上的「匹配數組」。感謝您的查看:)

編輯: 這就是我現在擁有的。

use warnings; 
use strict; 
use Digest::MD5 qw(md5_hex); 

my $dirname = "./"; 
opendir(DIR, $dirname); 
my @files = readdir(DIR); 
closedir(DIR); 

print "@files\n"; 

foreach my $file (@files) { 
    next if -d $file || !-r $file; 
    open(my $FILE, $file); 
    binmode($FILE); 
    #print digest::MD5->new->addfile($FILE)->hexdigest, " $file\n"; 
    Sdigest = Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n"; 

    my @array = ('667fc8db8e5519cacbf8f9f2af2e0b08'); 
     if($digest eq $array[0]) { 
      print "matches array", "\n"; 
     } else { 
      print "doesnt match array", "\n"; 
    } 
} 
system ('pause'); 


感謝大家的幫助。你們是真棒;)

+0

修復您的格式。很難說這裏有什麼奇怪的縮進。 – Cfreak

+0

好吧現在就這樣做。謝謝 – james28909

+0

當然,你想將它匹配到數組的第一個元素? $ array [0] –

回答

2

請不要使用smartmatch ~~。它在Perl的最新版本中被宣佈爲實驗性的,並且語義未來可能會發生變化。

最好的解決辦法是創建指紋的散列你知道:

my %fingerprints; 
$fingerprints{"667fc8db8e5519cacbf8f9f2af2e0b08"} = undef; 

如果你想指紋的整個數組加載到哈希,使我們可以很容易地測試存在與否,可以使用一個散片

@fingerprints{@array} =(); 

接下來,我們把當前文件的指紋在一個變量:

my $digest = Digest::MD5->new->addfile($FILE)->hexdigest; 

然後我們測試是否存在指紋的哈希$digest

if (exists $fingerprints{$digest}) { 
    print "$digest for <$file> -- FOUND\n"; 
} 
else { 
    print "$digest for <$file>\n"; 
} 

使用散列函數通常比通過數組循環(如果你多次查找)要快。


推薦完整的程序:

use strict; 
use warnings; 
use feature qw<say>; 
use autodie; # automatic error handling 
use Digest::MD5; 

my ($dirname, $fingerprint_file) = @ARGV; # takes two command line arguments 
length $dirname   or die "First argument must be a directory name\n"; 
length $fingerprint_file or die "Second argument must be a file with fingerprints\n"; 

# load the fingerprints 
my %fingerprints; 
open my $fingerprints_fh, "<", $fingerprint_file; 
while (<$fingerprints_fh>) { 
    chomp; 
    $fingerprints{$_} = undef; 
} 
close $fingerprints_fh; 

opendir my $directory, $dirname; 
while(my $file = readdir $directory) { 
    next if not -f $file; 

    open my $fh, "<:raw", "$dirname/$file"; 
    my $digest = Digest::MD5->new->addfile($fh)->hexdigest; 
    close $fh; 

    if (exists $fingerprints{$digest}) { 
    say qq($digest "$file" -- FOUND); 
    } 
    else { 
    say qq($digest "$file"); 
    } 
} 
closedir $directory; 

實施例調用

> perl script.pl . digests.txt 
+0

雖然所有的答案都可以正常工作,但這可能是我的情況,因爲我可以更新digests.txt文件,所以我不必更新腳本,只需.txt文件。 :) – james28909

+0

不能指定文件路徑,除非它們在同一目錄下「./」如果我嘗試指定「script.pl C:/用戶/用戶名/桌面/檢查此/ C:/digests/digests.txt」它完成與沒有錯誤,但它沒有輸出任何東西。在目錄路徑中嘗試使用「/」和「//」和「\\」。 – james28909

+0

我很想將這添加到右鍵單擊上下文菜單。我可以讓它exe。當我嘗試運行它時,我只是得到錯誤,因爲我無法在腳本中指定路徑。 – james28909

1

像這樣:

my $digest = Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n"; 

然後

if($digest eq $array[0]) 

順便說一句,這將可能是稍微更地道地說(早在你的代碼):

next if -d $file || !-r $file; 
+0

感謝:-)更正。 –

+1

太多bash會殺了你。 –

+0

我必須同意。 :-) –

2

也許以下將是有用的:

use warnings; 
use strict; 
use Digest::MD5 qw(md5_hex); 
use File::Basename; 

my $dirname = './'; 
my %MD5s = (
    '667fc8db8e5519cacbf8f9f2af2e0b08' => 1, 
    '8c0452b597bc2c261ded598a65b043b9' => 1 
); 

for my $file (grep { !-d and -r } <$dirname*>) { 
    open my $FILE, '<', $file or die $!; 
    binmode $FILE; 
    my $md5hexdigest = Digest::MD5->new->addfile($FILE)->hexdigest; 
    close $FILE; 

    print basename ($file), " md5hexdigest $md5hexdigest "; 

    if ($MD5s{$md5hexdigest}) { 
     print "matches hash", "\n"; 
    } 
    else { 
     print "doesn't match hash", "\n"; 
    } 
} 

示例輸出:

XOR_String_Match.pl md5hexdigest 8c0452b597bc2c261ded598a65b043b9 matches hash 
zipped.txt md5hexdigest d41d8cd98f00b204e9800998ecf8427e doesn't match hash 
+0

這很可愛。所以哈希比數組更適合使用?或者只是針對這個特定的實例? – james28909

+1

@ james28909如果元素的順序不重要,則哈希值是很好的。他們使用一種特殊的數據結構,可以快速找到一個元素。 – amon