#!/usr/bin/env perl # fast reimplementation, only handle order in text, single s/// per line. use strict; my %mapping; # mapping of digits my @definitions; my $counter = 1; while (<>) { if (/^\@footnotes?:/) { print; last; } s/\[(\d+)\]/'['.($mapping{$1} ||= $counter++).']'/ge; print; } die "missing footer" if eof; while (<>) { /^ \[ (\d+) \] (.*)/x or print, next; exists $mapping{$1} or warn("ignoring unused note: $_"), next; $definitions[$mapping{$1}] = $2; } for my $i ( 1..$#definitions ) { print "[$i]$definitions[$i]\n"; }