2015-04-12 3 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"; 
} 

Для сравнения двух строк построчно и показать линии, на которых Eсть никакой разницы.

Я знаю, что я написал, это смесь C/Perl/Pseudo-code. Как написать его так, как он работает на Perl?

ответ

2

То, что вы написали, вроде нормально, за исключением того, вы не можете использовать эти обозначения в Perl lines1.length, int $i и ~= не является оператором, вы имеете в виду =~, но это не тот инструмент здесь. Также if должен иметь блок { } после него.

Для того чтобы получить размер массива, my $i, вы должны указать лексическую переменную и eq для сравнения строк. Наряду с if (...) { ... }.

Технически вы можете использовать привязки оператор для выполнения сравнения строк, например:

"foo" =~ "foobar" 

Но это не очень хорошая идея, когда сравнения строковых строк, потому что вы можете получить частичные совпадения, и вы должны избегать метасимволов. Поэтому проще просто использовать eq.

Использование C-стиль для петель является допустимым, но более 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::LongString или Algorithm::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"; 

Даже после того, как spliting вы могли бы сравнить их как Array.

Смежные вопросы