2

这是我的代码。我希望提取部分文本并写入另一个文件。代码循环不会在我选择的文本范围内停止。它一直读到单词的最后一个匹配行。请给我提意见。谢谢。例如,我需要提取 $ NAME: sandy 直到 $$.TO ,然后加入 $NAME: patrick 中的内容,从 G1 开始直到 $$SRU。

文本:

$ NAME : corry  
$$.Inc s d
$$.Oc s
$$.TO

G1 ty n1 EE EE M T1 T2 $$SRU
G2 n1 y OO OO M T3 T4 $$SRU    
$$.EON

$ NAME : patrick    
$$.Inc c d
$$.Oc c
$$.TO

G1 td n3 EE EE M T5 T6 $$SRU      
G2 n3 y OO OO M T7 T8 $$SRU    
$$.EON
$ NAME : sandy    
$$.Inc k l
$$.Oc l
$$.TO

G1 td n3 FF FF M R5 R6 $$SRU      
G2 n3 y OO OO N R7 R8 $$SRU    
$$.EON

输出:例如。

$ NAME : sandy    #from sandy section
$$.Inc k l      #sandy
$$.Oc l         #sandy
$$.TO           #sandy
G1.G1o.n ty n1 EE EE M T1 T2 $$SRU #from Patrick section
G2.G2o.n n1 y OO OO M T3 T4 $$SRU   #Patrick 
Fe.id.n ty n1 EE EE N T1 T2 $$SRU #corry
Fr.in.p n1 y OO OO N T3 T4 $$SRU   #corry 
$$.EON     #Patrick

代码:

use strict;
use warnings;

open my $F1, '<', 'testing.txt' or die "failed $!";
open my $F2, '>', 'out.txt' or die "failed $!";

while (<$F1>) {
 if (/^\$ NAME : sandy/../\$.TO/) {
 print $F2 $_;
 }
 if (/^\$ NAME : patrick/../\$.EON/) {
 if(/^G1/../\$SRU/){
 s/G1/G1.G1o.n/g;
 print $F2 $_;}
}

 }
close $F1;
close $F2;
4

2 回答 2

2

您可以将所有文件解析为一个大哈希,并对其元素做任何您想做的事情:组合、更改等

use strict;
use warnings;
use Data::Dumper;

open my $F1, '<', 'in' or die "failed $!";
open my $F2, '>', 'out.txt' or die "failed $!";


my %elements;
my $current_element;
while (<$F1>) {
    if ( /^\$ NAME : (\w+)/ .. /\$\$[.]EON/ ) {
        if ( /^\$ NAME : (\w+)/ ) {
            $current_element = $1;
        }
        if ( /^G1/ ) {
            $elements{$current_element}->{g1} .= $_;
        }
        elsif ( /^G2/ ) {
            $elements{$current_element}->{g2} .= $_;
        }
        elsif ( ! /\$\$[.]EON/ ) {
            $elements{$current_element}->{text} .= $_;
        }

    }
}
close $F1;
$elements{patrick}->{g1} =~ s/G1/G1.G1o.n/;
$elements{patrick}->{g2} =~ s/G1/G2.G2o.n/;
$elements{corry}->{g1} =~ s/G1/Fe.id.n/;
$elements{corry}->{g2} =~ s/G2/Fr.in.p/;
print $F2 "$elements{sandy}->{text}$elements{patrick}->{g1}$elements{patrick}->{g2}$elements{corry}->{g1}$elements{corry}->{g2}\n\$\$.EON";
close $F2;

这会将所有文件解析为哈希,如下所示:

  1. $elements{'name (for example patric'}->{text} = '除了 G1 和 G2 部分之外的所有部分'
  2. $elements{'名称(例如 patric'}->{g1} = 'G1 部分'
  3. $elements{'name (例如 patric'}->{g2} = 'G2 section'

所以如果你想text从桑迪和G1帕特里结合起来,你可以做

my $sandy_patric = $elements{sandy}->{text}.$elements{patrick}->{g1};
于 2013-10-15T07:21:30.113 回答
0

你离解决方案不远了。patrick当在部分内找到以 开头的行时,我会设置一个标志G1,并且我会将每一行保存在一个数组中(替换后)以在处理该sandy部分后附加它:

#!/usr/bin/env perl

use warnings;
use strict;

my (@patrick, $flag);

open my $F1, '<', 'testing.txt' or die "failed $!";
open my $F2, '>', 'out.txt' or die "failed $!";

while ( <$F1> ) { 
    if (/^\$ NAME : sandy/../\$\.TO/) {
        print $F2 $_; 
    }   
    if (/^\$ NAME : patrick/../\$\.EON/) {
        if ( m/\AG1/ ) { $flag = 1 } 
        if ( $flag ) { 
            s/\A(G\d+)/$1.$1o.n/;
            #print $F2 $_;
            push @patrick, $_; 
        }      
    }   

}

print $F2 $_ for @patrick;

close $F1;
close $F2;

它将创建一个out.txt包含以下内容的文件:

$ NAME : sandy    
$$.Inc k l
$$.Oc l
$$.TO
G1.G1o.n td n3 EE EE M T5 T6 $$SRU      
G2.G2o.n n3 y OO OO M T7 T8 $$SRU    
$$.EON
于 2013-10-15T07:52:02.083 回答