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