in reply to Extracting formatted text block

My way (documented):

use strict; use warnings; sub rtrim { local $_ = (@_ ? $_[0] : $_); s/\s+$//; return $_; } { local $_; # Skip junk at top. do { defined($_ = <DATA>) or die("Bad data.\n"); } while (!/^\s*-+\s+(-+)\s+-+\s+(-+)/); # Find field positions and lengths. # Could be hardcoded. my $match_start1 = $-[1]; my $match_length1 = $+[1] - $match_start1; my $match_start2 = $-[2]; my $match_length2 = $+[2] - $match_start2; # Extract the names. my @names1; my @names2; while (defined($_ = <DATA>) && !/^\s*$/) { push(@names1, rtrim(substr($_, $match_start1, $match_length1))) if length()-1 >= $match_start1; push(@names2, rtrim(substr($_, $match_start2, $match_length2))) if length()-1 >= $match_start2; } my @names = (@names1, @names2); # Display results. print(join(', ', @names), $/); }

Update: Didn't notice there were two columns of names. Fixed.