这是我的代码。我希望提取部分文本并写入另一个文件。代码循环不会停留在我选定的文本范围内。它读到字的最后一行。请建议我。谢谢。例如,我需要提取$ NAME:sandy直到$$。TO然后加入$ NAME:patrick中的内容,这是从G1开始直到$$ SRU。
TEXT:
$ 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;
答案 0 :(得分: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;
这会将所有文件解析为哈希,如下所示:
所以如果你想要结合来自沙地的text
和来自patric的G1
你可以做
my $sandy_patric = $elements{sandy}->{text}.$elements{patrick}->{g1};
答案 1 :(得分:0)
你离解决方案不远了。我会在patrick
部分内部设置一个标志,我找到以G1
开头的行,并且我会将每行保存在一个数组中(替换后),以便在处理{{1}后附加它部分:
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