Ok, forse la mia richiesta di aiuto è stata poco mirata ! Il fatto è che mi serve proprio di trasformare il programma in Perl in una funzione PHP e siccome sono giunta alla conclusione che non sia possibile fare una traduzione terra terra, allora sto cercando di capire bene quello che fa per cercare di scrivere la funzione PHP che ci assomigli. Però ho dei problemi, questa volta un po' più precisi. Eccoli:

foreach $f (@ARGV)
{
push @files, $f if (-T $f);
}
Cosa fa l'if dentro il ciclo? Non so cosa significhi il controllo (-T $f). @ARGV è un array di file e @files è un altro array di questi file che però contiene solo quelli che ...?
\*\*\*\*\*\

$fileTable{$curfn}{nNgrams} = length ($tokenified) + 1 - $ngramlen;
$f1 = \%{$fileTable{$curfn}};
$value = 1 / $f1->{nNgrams};
for (my $i = 0; $i < $f1->{nNgrams}; $i++) {
$cursub = substr ($tokenified, $i, $ngramlen);
$f1->{ngtbl}{$cursub} += $value;
$centroid{$cursub} += $value;
}
Cosa fa l'assegnazione $f1 = \%{$fileTable{$curfn}};? Non so che operazione fa su $fileTable{$curfn} con \%.
\*\*\*\*\*\

Poi ci sono tutte le espressioni regolari che non so che cosa identificano. Forse il manuale di perl su cui sto studiando non è tra i migliori, però è l'unico che ho trovato in formato html, comunque ecco alcune delle cose che non ho capito nelle espressioni regolari:
s/\b\d[.0-9]*\b/00/gm; # Numbers -> 00
s/\b\w\b/XX/gm; # Single letters -> two letters
s/\b00\b/0/gm; # 00 -> 0
foreach $k (keys %keywords) {
$v = $keywords{$k};
s/(\W)$k(\W)/$1 $v $2/gm;
}
s/\b\w{2,}\b/a/gm; # Collapse identifiers to a single letter
s/\s+//gm; # Eliminate white space
Perchè tutte le espressioni cominciano con s/ e finiscono con /gm (anche se poi non è vero perchè altre espressioni nel programma non finiscono con /gm!)? Lo \b vuol dire si usa per separare le espressioni come si presentano da come devono diventare o ha un significato nell'espressione (questa cosa mi è venuta in mente perchè ho visto che dove deve sostituire con niente non c'è \b)? Che cosa fa quando usa $1 e $2 all'interno del foreach?
\*\*\*\*\*\

Ecco altre espressioni regolari che non so che cosa identificano.
$_ = shift;
tr/[\x1e\x1f]//d; # Remove characters used to kill comments
s/\\[ \t]*\n//gm; # Merge continued lines
s/^(\s)*\#[^\n]*$//gm; # Get rid of all preprocessor directives
s/\/\/[^\n]*\n//g; # Get rid of C++ comments.
s/\/\*/\x1e/gm; # Mark the start of C comments
s/\*\//\x1f/gm; # Mark the end of C comments
s/\x1e[^\x1f]*\x1f//gm; # Kill all text between /* and */
s/\\\"//g; # Remove \" from strings
s/\\\'//g; # Remove \' from strings
s/\"[^\"]*\"/\"/g; # Collapse strings delimited by "
s/\'[^\']*\'/\'/g; # Collapse strings delimited by '
return $_;
E poi che cosa fa precisamente la funzione shift? Nel manuale c'è scritto che serve per usare un array come uno stack o come una coda ma in questo caso non so in che modo e poi non so a che cosa potrebbe servire visto che viene usato in una funzione per la tokenizzazione e poi non viene eseguita nessuna altra operazione oltre alle sostituzioni.

Grazie a chiunque può darmi una mano.
Fab