Advertisement
Guest User

driftingprogrammer SO question

a guest
Dec 17th, 2015
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.00 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use warnings;
  4. use strict;
  5.  
  6. open (XIN, '<', 'driftingprog-in.xml') or die "$!\n";
  7. open (XOUT, '>', 'driftingprog-out.xml') or die "$!\n";
  8.  
  9. my %content;
  10.  
  11. ## stores 3 lines from file, used by second loop
  12. my @block;
  13.  
  14. while (<XIN>) {
  15.   if (/<content ID="(.*?)">(.*?)<\/content>/) {
  16.     my ($id, $text) = ($1, $2);
  17.     $content{$id} = $text;
  18.   } elsif (/<text>/) {
  19.     ## keep this line for next loop
  20.     push @block, $_;
  21.     ## when we start seeing <text> tags, go to next loop for these
  22.     last;
  23.   }
  24.   print XOUT $_;
  25. }
  26.  
  27. while (1) {
  28.   ## read up to 3 lines into @block
  29.   for (scalar(@block)+1..3) { my $l = <XIN>; last if (!defined $l); push @block, $l; }
  30.   ## if we've read nothing, we are at EOF
  31.   last if (scalar(@block) == 0);
  32.  
  33.   my $concat = join '', @block;
  34.   if ( ($concat =~ s/(<text>\s*)<reference value="#(.*?)" \/>(\s*<\/text>)/$1.$content{$2}.$3/es) > 0) {
  35.       print XOUT $concat;
  36.       @block = ();
  37.   } else {
  38.       print XOUT shift @block;
  39.   }
  40. }
  41.  
  42. close XOUT;
  43. close XIN;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement