2015-04-12 37 views
2

比較兩個字符串一行行我要尋找一個在Perl代碼類似於在Perl

my @lines1 = split /\n/, $str1; 
my @lines2 = split /\n/, $str2; 

for (int $i=0; $i<lines1.length; $i++) 
{ 
    if (lines1[$i] ~= lines2[$i]) 
    print "difference in line $i \n"; 
} 

要逐行比較兩個字符串行,並顯示在其上有任何區別的線。

我知道我寫的是混合C/Perl /僞代碼。我如何以它在Perl上的工作方式編寫它?

回答

2

你寫的是什麼樣的好,除了你不能使用該符號在Perl lines1.lengthint $i~=不是一個運營商,你的意思=~,但這裏是錯誤的工具。之後if必須有一個塊{ }

你想要的只是$i < @lines1獲取數組大小,my $i聲明一個詞法變量,eq字符串比較。隨着if (...) { ... }。比較文字字符串時

"foo" =~ "foobar" 

但它是不是一個好主意,因爲你可以得到部分匹配,你需要:

從技術上講,你可以使用綁定操作員執行字符串比較,例如轉義元字符。因此使用eq更容易。

使用C風格的for循環是有效的,但更多的Perl的十歲上下的方法是使用這個符號:

for my $i (0 .. $#lines1) 

這將遍歷範圍0到陣列的最大指數。

+1

此外,'if'塊需要'{...}'大括號。 –

0

Perl的允許您使用的標量變量的引用包含字符串打開對字符串的文件句柄:

open my $string1_fh, '<', \$string1 or die '...'; 
open my $string2_fh, '<', \$string2 or die '...'; 

while(my $line1 = <$string1_fh>) { 
    my $line2 = <$string2_fh>; 
    .... 
    } 

但是,這取決於你所說的有什麼區別(不包括線的插入或缺失?),你可能想要不同的東西。

CPAN上有幾個模塊可以檢查想法,如Test::LongStringAlgorithm::Diff

0

my @lines1 = split(/^/, $str1); 
my @lines2 = split(/^/, $str2); 

# splits at start of line 
# use /\n/ if you want to ignore newline and trailing spaces 

for ($i=0; $i < @lines1; $i++) { 
    print "difference in line $i \n" if (lines1[$i] ne lines2[$i]); 
} 
+2

這裏給出一些你想要做的解釋是有用的 – Mysterion

0

比較數組是一個比較容易的方式,如果你創建一個HashMap出來吧......

#Searching the difference 
@isect =(); 
@diff =(); 
%count =(); 

foreach $item (@array1, @array2) { $count{$item}++; } 

foreach $item (keys %count) { 
    if ($count{$item} == 2) { 
     push @isect, $item; 
    } 
    else { 
     push @diff, $item; 
    } 
} 

#Output 
print "Different= @diff\n\n"; 
print "\nA Array = @array1\n"; 
print "\nB Array = @array2\n"; 
print "\nIntersect Array = @isect\n"; 

即使劈裂後,你可以把它們比爲陣。