文件1:
Apple
Orange
grapes
文件2:
Orange
grapes
Apple
我想檢查兩個文件是否有不同順序相同的數據。
如何做到這一點,而無需使用任何外部模塊?
文件1:
Apple
Orange
grapes
文件2:
Orange
grapes
Apple
我想檢查兩個文件是否有不同順序相同的數據。
如何做到這一點,而無需使用任何外部模塊?
use strict;
use warnings;
# $d{LINE} = TALLY
my ($n, %d) = (1);
while (<>){
$d{$_} += $n;
$n *= -1 if eof;
}
# Now get whatever kind of lines you are interested in.
my @same_in_both_files = grep { $d{$_} == 0 } keys %d;
my @surplus_in_file1 = grep { $d{$_} > 0 } keys %d;
my @surplus_in_file2 = grep { $d{$_} < 0 } keys %d;
# Or just get a true-false verdict.
my $files_differ = 1 if grep $_, values %d;
一些更可讀的Perl我見過一段時間... – 2010-07-14 13:11:42
如果您想使用perl來查找兩個文件之間的差異,您可以嘗試使用Text::Diff CPAN模塊。
我不能使用該主機上的任何extenal模塊! – Tree 2010-07-14 10:41:58
是的,你可以。該模塊是純粹的Perl,所以如果你可以在主機上保存一個文件,那麼你可以使用它。至少你可以在你編碼生命的地方創建一個Text dir,在那裏保存http://cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/lib/Text/Diff.pm,然後創建一個Diff dir在那裏,保存該目錄中的http://cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/lib/Text/Diff/Table.pm,鏡像http://中找到的lib目錄的內容cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/我不是說這是要使用的模塊,只是最有可能使用模塊,至少是純Perl模塊 – mirod 2010-07-14 10:53:36
優秀 - 它非常棒有用.... – Tree 2010-07-14 14:16:29
手動操作是一個簡單的練習。將第一個文件讀入一行/ linenumber的散列表,然後從該表中刪除第二個文件。如果存在一個使用者的話,把它放到第二個表中。表中的任何內容都表示不匹配的內容,並且表中包含不同行的行號。
這裏有一個簡單的方法做你想做的事,perl的:
在pfile1:
Apple
Orange
grapes
在pfile2:
Orange
grapes
Apple
perl腳本:
#!/usr/bin/env perl
open (FILE1, "pfile1") || die ("Can't open file pfile1 for reading");
open (FILE2, "pfile2") || die ("Can't open file pfile2 for reading");
my @file1 = <FILE1>;
my @file2 = <FILE2>;
@sorted_file1 = sort @file1;
@sorted_file2 = sort @file2;
die("Your Files are different\n")
unless ($#sorted_file1 == $#sorted_file2);
for my $item (0 .. $#sorted_file1) {
if ($sorted_file1[$item] ne $sorted_file2[$item]) {
die("Your Files are different\n");
}
}
print "Your Files are the same\n";
這是通過閱讀文件行放入數組中,然後對數組進行排序。它檢查兩個數組的長度是否相同,如果兩個數組之間的相應索引值不同,則會提前退出。
然後您將收到一條消息,指出這些文件是相同的或不相同的。
你可以執行'diff'這樣的命令行工具嗎? – 2010-07-14 10:49:44
爲什麼「不使用任何外部模塊」? – 2010-07-14 11:04:58
['File :: Compare'](http://perldoc.perl.org/File/Compare.html)是核心並解決了部分問題。 – daxim 2010-07-14 12:17:30