比较并替换perl中的两个文件

时间:2013-05-16 09:27:47

标签: perl

我试图比较两个文件test1,test 2

中的字符串

测试1:

 <p><imagedata rid="rId7"></p>
  ...
 <p><imagedata rid="rId8"></p>

的Test2:

<imagesource Id="rId7" Target="image/image1.jpg"/>
...
<imagesource Id="rId9" Target="image/image2.jpg"/>
...
<imagesource Id="rId8" Target="image/image3.jpg"/>

我想要的是,第一个文件应该替换为图像目标路径,如:

 <p><imagedata src="image/image1.jpg"></p>
  ...
 <p><imagedata rid="image/image3.jpg"></p>

我试图从两个文件中提取文本,但我坚持比较两个字符串

 opendir(DIR, $filenamenew1);

 our(@test1,@test2);

 open fhr, "$filenamenew1/test1.txt";

 open fhr1, "$filenamenew1/test2.txt";


 my @line;

 @line= <fhr>;

 for (my $i=0;$i<=$#line;$i++)
 {
 if ($line[$i]=~m/rid="(rId[0-9])"/)
 {
 my $k = $1;

 push (@test1, "$k");
 }
 }


 my @file2;

 @file2= <fhr1>;

 for (my $i=0;$i<=$#file2;$i++)
 {
 if ($file2[$i]=~m/Id="(rId[0-9])"/)
 {
 my $k1 = $1;

 push (@test2, "$k1");


 foreach (@test1 = @test2)
 {
 print "equal";
 }

 }

 }

1 个答案:

答案 0 :(得分:0)

一种解决方案可能是首先使用<imagesources>读取文件,并将ridtarget保存在哈希中。之后逐行读取另一个文件并比较哈希中是否存在rid并进行替换,如下所示:

script.pl的内容:

#!/usr/bin/env perl

use warnings;
use strict;

my (%hash);

open my $fh2, '<', shift or die;
open my $fh1, '<', shift or die;

while ( <$fh2> ) {
        chomp;
        if ( m/Id="(rId\d+)".*Target="([^"]*)"/i ) {
                $hash{ $1 } = $2;
        }
}

while ( <$fh1> ) {
        if ( m/rId="([^"]+)"/i && defined $hash{ $1 } ) {
                s//src="$hash{ $1 }"/;
        }
        print $_;
}

像以下一样运行:

perl script.pl test2 test1

产量:

<p><imagedata src="image/image1.jpg"></p>
 ...
<p><imagedata src="image/image3.jpg"></p>