#!/usr/bin/env perl use strict; use warnings; # footnote renumbering by order of occurance (Linux-Magazin 10/2008) # (sys+cpu ~23%, mem ~28% of RLS' version) # Author: Horst-W. Radners, utilizing a version by Randal L. Schwartz my %mapping; # hash mapping old to new numbering # read and print text-part line-by-line, # changing note-refs to ascending new numbering on the fly my $num_new = 0; while (<>) { last if /^\@footnote:/; s/\[ (\d+) \]/'[' . ($mapping{$1} ||= ++$num_new) . ']'/egx; print; } die(' *** missing footer') if eof; print "\@footnote:\n"; # read and store footnotes in memory for reordered printing my @fnote; # array of notes, indexed by new numbering while (<>) { my ( $num_old, $text ) = /^ \[ (\d+) \] \s* (.*)/x or print, next; my $num_new = $mapping{$num_old} or warn(" *** ignoring unused note: $_"), next; $fnote[$num_new] = $text; } # print footnotes, sorted by new numbering foreach my $num ( 1 .. $#fnote ) { unless ( defined $fnote[$num] ) { warn(" *** ignoring dangling ref w/o note: $num"); next; } print "[$num] $fnote[$num]\n"; }