Lo studio del Perl puo` anche essere intressante e divertente ...
Le variabili sono di tre tipi:
scalari (con prefisso $)
vettori (prefisso @)
hash (prefisso %) - array associative
Per una trattazione migliore delle variabili, vedi il manuale perldata

Comunque provo a mettere dei commenti al codice, in modo che sia piu` facile interpretarlo.
codice:
my $page_number = 1;   # definizione e inizializz. di una variabile scalare
my %idx;                          # definizione di una hash

while(<> ) {                       # loop su tutte le righe di input (legge una riga e la mette in $_)
        for my $word ( split(/\s+/) ) {              # spezza la $_ secondo i caratteri blank 
                   # salva il primo in $word - dentro la parentesi dello split e` una RE
                $idx{$word}{$page_number} = 1;  # scrive 1 nella posiz della hash la cui chiave e` $word che diventa a sua volta hash con chiave $page_number (su questo ho qualche dubbio)
        }
        $page_number++ if ( /\014/ );   # incremente $page_number se $_ e` <FF> 
               # \014 denota numero ottale
}

foreach my $word (sort keys %idx) {   # ordina la hash secondo le chiavi ed estrae le chiavi una alla volta 
        printf "%-20s ", $word;       # stampa la chiave (in maniera formattata)
        print comma_sep(sort {$a <=> $b} keys %{$idx{$word}});  # ordina e stampa in modo CSV
        print "\n";   # stampa la fine riga 
}

sub comma_sep {        # serve per dire alla routine precedente cosa significa CSV
        my $ret = "";
        foreach (@_) { $ret .= $_ . ", "; }
        chop $ret;                                       
        chop $ret;
        return $ret;
}