use warnings; use strict; my $DATAFILE = 'data.txt'; my $INSERTFILE = 'insert.txt'; my $OUTFILE = 'output.txt'; open my $ofh, '>', $OUTFILE or die "$OUTFILE: $!"; select($ofh); # "print"s will go to this handle now open my $dfh, '<', $DATAFILE or die "$DATAFILE: $!"; my $state = 'before nodes'; while ( my $line = <$dfh> ) { if ( $line =~ /^\s*NODE\b/ ) { if ( $state eq 'before nodes' ) { $state = 'in nodes'; } elsif ( $state eq 'in nodes' ) { } elsif ( $state eq 'after nodes' ) { die "expected only one section of NODEs" } else { die $state } } else { if ( $state eq 'before nodes' ) { } elsif ( $state eq 'in nodes' ) { do_node_insert($INSERTFILE); $state = 'after nodes'; } elsif ( $state eq 'after nodes' ) { } else { die $state } } print $line; } close $dfh; sub do_node_insert { my $file = shift; open my $ifh, '<', $file or die "$file: $!"; while ( my $line = <$ifh> ) { next unless $line =~ /^\s*NODE\b/; print $line; } close $ifh; }