use strict; use warnings; open my $file, '<', 'input.txt' or die $!; process_file($file); exit 0; sub process_file { my ($fh) = @_; while ( my $line = <$fh> ) { print $line; if ( $line =~ /section start marker/ ) { $line = handle_section($fh); redo if defined $line; } } } sub handle_section { my ($fh) = @_; my ( @entries, $line ); while ( $line = <$fh> ) { last unless $line =~ m{ ( [^(]+ ) # 1 anything except opening paren \s # space \( # opening paren ( \d+ ) # 2 number }x; push @entries, [ pack( 'Na*', $2, $1 ), $line ]; } print map { $_->[1] } sort { $a->[0] cmp $b->[0] } @entries; return $line; }