在Perl中逐行比较两个字符串

时间:2015-04-12 13:00:43

标签: arrays string 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 / Pseudo-code的混合物。我如何以它在Perl上运行的方式编写它?

4 个答案:

答案 0 :(得分:2)

你所写的内容还不错,除非你不能在Perl lines1.lengthint $i中使用该表示法,而~=不是运算符,你的意思是=~ ,但这是错误的工具。另外,if后面必须有一个{ }块。

你想要的只是$i < @lines1来获取数组大小,my $i来声明一个词法变量,eq来进行字符串比较。与if ( ... ) { ... }一起。

从技术上讲,您可以使用绑定运算符来执行字符串比较,例如:

"foo" =~ "foobar"

但是在比较文字字符串时这不是一个好主意,因为你可以获得部分匹配,并且你需要转义元字符。因此,使用eq更容易。

使用C风格的for循环是有效的,但更多的Perl-ish方法是使用这种表示法:

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

将迭代范围0到数组的最大索引。

答案 1 :(得分: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

答案 2 :(得分: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]);
}

答案 3 :(得分: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";

即使在拆分后,您也可以将它们作为数组进行比较。