#!/usr/bin/perl while (my $line = <>) { if($w) { $line =~ /^\[(\d+)\]\s+(.*)$/; $footnote[$index{$1}] = $2; } else { $w = 1 if $line =~ /^\@footnotes/; @hits = $line =~ /\[(\d+)\]/g; foreach my $hit (@hits) { if( not defined $index{$hit}) { $index{$hit} = ++$i }; $line =~ s/\[$hit\]/\[$index{$hit}\]/g; } print $line; } } for my $i (1..$#footnote+1) { printf( "[%d] %s\n", $i, $footnote[$i] ? $footnote[$i] : 'not defined' ) if defined($footnote[$i]) or defined($index{$i}) }