#!/usr/bin/env perl # Randall array use strict; use constant { USED => 0, DEFINED => 1, DEFINITION => 2 }; my $ORDER_BY = USED; #my $ORDER_BY = DEFINED; my @parsed; my %mapping; # mapping of digits { my $counter = 1; while (<>) { if (/^\@footnotes?:/) { push @parsed, $_; last; } while (s/^ (.*?) \[ (\d+) \]//x) { push @parsed, $1; push @parsed, $mapping{$2} ||= [$counter++]; } push @parsed, $_; } } die "missing footer" if eof; { my $counter = 1; while (<>) { my ($number, $text) = /^ \[ (\d+) \] (.*)/x or (push @parsed, $_), next; my $item = $mapping{$number} or warn("ignoring unused note: $_"), next; $item->[DEFINED] = $counter++; $item->[DEFINITION] = $text; } } for my $item (@parsed) { if (ref $item) { printf '[%s]', $item->[$ORDER_BY]; } else { print $item; } } for my $itemkey (sort { $mapping{$a}[$ORDER_BY] <=> $mapping{$b}[$ORDER_BY] } keys %mapping) { my $value = $mapping{$itemkey}; printf "[%s]%s\n", $value->[$ORDER_BY], $value->[DEFINITION]; }