I’m trying to write a script to consolidate my book index, and I’ve run into a problem that’s driving me nuts. Can anyone see what’s going on here?
Here’s the relevant code:
if ($pagenumber) { #6
$numbers = $_;
$i = 0;
foreach (@numberarray) {
$numberarray[$i] = “”;
$i = $i + 1;
} # End foreach
$i = 0;
foreach (@sorted_numbers) {
$sorted_numbers[$i] = “”;
$i = $i + 1;
} # End foreach
$i = 0;
print $DEBUG2 “\$numbers is $numbers before entering while.\n”;
while ($numbers =~ /(\d+)(.*)/) {
print $DEBUG2 “\$1 is |$1|, \$pagenumber is |$pagenumber|.\n”;
if (!($1 eq $pagenumber)) {
$numberarray[$i] = $1;
$i = $i + 1;
} # End if
print $DEBUG2 “In while loop, \$numberarray[$i] is $numberarray[$i].\n”;
$numbers = $2;
print $DEBUG2 “Point 10: \$numbers is $numbers, \$i is |$i|.\n”;
} # End while
$numberarray[$i] = $pagenumber;
print $DEBUG2 “After while loop, \$numberarray[$i] is |$numberarray[$i]|, \$sorted_numbers[$i] is |$sorted_numbers[$i]|\n”;
@sorted_numbers = sort { $a <=> $b } @numberarray;
@numberarray = @sorted_numbers;
print $DEBUG2 “After sort, \$sorted_numbers[$i] is |$sorted_numbers[$i]|.\n”;
print $DEBUG2 “After sort \@numberarray is @numberarray, \$numberarray[$i] is $numberarray[$i].\n”;
$i = 0;
print $DEBUG2 “About to enter foreach (\@sorted_numbers).\n”;
$next = $i + 1; #Just for diagnostics
print $DEBUG2 “Before foreach, \$totalname is |$totalname|, \$numberarray[$i] is |$numberarray[$next]|, \$numberarray[$next] is |$numberarray[$i+1]|.\n”;
foreach (@numberarray) {
print $DEBUG2 “Got inside the loop.\n”;
print $DEBUG2 “**\$totalname is $totalname for \$i = $i.\n”;
$totalname = $totalname . ” ” . “$numberarray[$i],”;
$i = $i + 1;
}
print $DEBUG2 “Before chop condition, \$totalname is $totalname.\n”;
if ($totalname =~ /.*\,$/) {chop $totalname}
print $DEBUG2 “After chop condition, \$totalname is $totalname.\n”;
And here’s the debug output, for two different cases. One works, the other doesn’t and I can’t figure out what’s happening, but whatever it is, it seems to be happening in the sort. They should both give similar output — the name and a single page number, but as you can see, they don’t.
CASE 1
$numbers is Michael Adams 19, before entering while.
$1 is |19|, $pagenumber is |19|.
In while loop, $numberarray[0] is .
Point 10: $numbers is ,, $i is |0|.
After while loop, $numberarray[0] is |19|, $sorted_numbers[0] is ||
$sorted_numbers[0] is |19|.
after exiting @numberarray is 19, $numberarray[0] is 19.
About to enter foreach (@sorted_numbers).
Before foreach, $totalname is |Adams, Michael|, $numberarray[0] is ||, $numberarray[1] is ||.
Got inside the loop.
**$totalname is Adams, Michael for $i = 0.
Before chop condition, $totalname is Adams, Michael 19,.
After chop condition, $totalname is Adams, Michael 19.
CASE 2
$numbers is Bill Anders 26, before entering while.
$1 is |26|, $pagenumber is |26|.
In while loop, $numberarray[0] is .
Point 10: $numbers is ,, $i is |0|.
After while loop, $numberarray[0] is |26|, $sorted_numbers[0] is ||
$sorted_numbers[0] is ||.
after exiting @numberarray is 26, $numberarray[0] is .
About to enter foreach (@sorted_numbers).
Before foreach, $totalname is |Anders, Bill|, $numberarray[0] is ||, $numberarray[1] is ||.
Got inside the loop.
**$totalname is Anders, Bill for $i = 0.
Got inside the loop.
**$totalname is Anders, Bill , for $i = 1.
Got inside the loop.
**$totalname is Anders, Bill , , for $i = 2.
Before chop condition, $totalname is Anders, Bill , , 26,.
After chop condition, $totalname is Anders, Bill , , 26.