# Subroutines sub arrays_match { my ($p1, $p2) = @_; if (@$p1 != @$p2) { return 0; # Lengths don't match } for (my $i = 0; $i < @$p1; $i++) { if ($p1->[$i] ne $p2->[$i]) { # Elements don't match printf "Mismatch at line %d:\n", $i + 1; printf " Array1: '%s'\n", $p1->[$i]; printf " Array2: '%s'\n", $p2->[$i]; return 0; } } return 1; # Arrays match } sub generate_output { my ($parray) = @_; my @output = ( ); foreach my $line (@$parray) { push @output, transform_line($line); } return [ @output ]; } sub transform_line { my $line = shift; $line =~ s/\s+$//; # Trim trailing whitespace # Assume the line is 6 words, followed (optionally) by any # combination of { i, E, U } (with optional space around them), # followed (optionally) by more words. # if ($line !~ s/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+//) { die "Didn't get expected 6 words in line:\n$line\n"; } my $output = join('|', $1, $2, $3, $4, $5, $6); if ($line =~ s/((i\s*)?(E\s*)?(U\s*)?)//) { # Split on whitespace, and then put the optional { i, E, U } # back together, with a single space between each. my $optarg = join(' ', split(/\s+/, $1)); $output .= "|$optarg"; } while ($line =~ s/^\s*(\S+)//) { my $word = $1; $output .= "|$1"; } $output .= "|"; return $output; }