PDA

Visualizza la versione completa : da PERL al pseudo-codice


hopeful
09-03-2008, 16:55
Salve a tutti.

Sto cercando di capire uno script di Perl che costruisce un indice analitico di un testo; se per favore qualcuno mi può aiutare trascrivendomi il pseudo-codice. Grazie


my $page_number = 1;
my %idx;

while(<>) {
for my $word ( split(/\s+/) ) {
$idx{$word}{$page_number} = 1;
}
$page_number++ if ( /\014/ );
}

foreach my $word (sort keys %idx) {
printf "%-20s ", $word;
print comma_sep(sort {$a <=> $b} keys %{$idx{$word}});
print "\n";
}

sub comma_sep {
my $ret = "";
foreach (@_) { $ret .= $_ . ", "; }
chop $ret;
chop $ret;
return $ret;
}
Grazie a chiunque mi può aiutare.

Mich_
10-03-2008, 09:10
Premesso che non so cosa intendi per pseudo-codice, prima di chiedere aiuto in quel modo dovresti cercare di aiutare tu chi ti puo` aiutare.
Un codice non indentato e` complesso da analizzare a mano, e reindentare il codice e` un lavoro che puoi fare tu.
Prova a postare il codice correttamente indentato usando i VBcode corretti (devi usare i tasti # oppure PHP).

hopeful
11-03-2008, 11:10
Ringrazio Mich_ e chiedo scusa.




my $page_number = 1;
my %idx;

while(<>) {
for my $word ( split(/\s+/) ) {
$idx{$word}{$page_number} = 1;
}
$page_number++ if ( /\014/ );
}

foreach my $word (sort keys %idx) {
printf "%-20s ", $word;
print comma_sep(sort {$a <=> $b} keys %{$idx{$word}});
print "\n";
}

sub comma_sep {
my $ret = "";
foreach (@_) { $ret .= $_ . ", "; }
chop $ret;
chop $ret;
return $ret;
}



Per pseudocodice, pseudolinguaggio o linguaggio di progetto si intende un linguaggio di programmazione fittizio, non direttamente compilabile o interpretabile da un programma compilatore o interprete, il cui scopo è quello di rappresentare algoritmi.(Fonte:Wikipedia)

In pratica sto cercando di decodificare il significato di questo script; quello che ho capito ad esempio è che \014 indica UN FORM-FEED, (quindi segna l'inserimento di una pagina nuova). Forse split(/\s+/) è una funzione split appliccata ad una regex.
Ma che cosa indichino i caratteri $ % non ne ho la minima idea, così il resto dello script: $ serve per introdurre una variabile?

Grazie a chi mi può dare una mano, ... altrimenti dovrò mettermi allo studio di PERL.

:ciauz:

Mich_
11-03-2008, 11:39
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.


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;
}

hopeful
11-03-2008, 15:56
Grazie assai.

Lo studio del Perl puo` anche essere interessante e divertente ...
Mi metteri subito a studiarlo se
a) sapessi che è il migliore programma per text processing ;
b) avessi fra le mani un manuale progressivo, ad hoc per il mio argomento, e con esercizi.

Non sono un programmatore; quel poco che so ... l'ho imparato come autodidatta

Grazie ancora
:ciauz:

Mich_
11-03-2008, 16:06
Originariamente inviato da hopeful
a) sapessi che è il migliore programma per text processing ;Non so se e` il migliore. Certo che in materia di gestione delle stringhe e` molto potente: sicurametne molto piu` di C o Pascal.



b) avessi fra le mani un manuale progressivo, ad hoc per il mio argomento, e con esercizi.

Non sono un programmatore; quel poco che so ... l'ho imparato come autodidatta
Io l'ho imparato modificando il famoso formMail, e guardando i manuali. Ora ci sono anche manuali progressivi. Tutti i manuali vengono distribuiti assieme all'interprete, e in ambiente Linux sono sempre disponibili tramite i comandi
man perl
man perlXXX
dove al posto di XXX devi metterci i vari pezzi che trovi nel man perl.

Certo che quel pezzo che hai mostrato non e` il modo piu` semplice per approcciarsi a Perl: contiene varie cose implicite che sono piuttosto ostiche, specie a chi proviene da altri linguaggi.

Altri punti di riferimento importati sono il sito di shishii e il manuale Perl di HTML.it

hopeful
12-03-2008, 20:37
Grazie per le dritte.
Io lavoro un pò con i programmi che girano dalla linea di comando di Linux.
Un'ultima domanda: ma il famoso formMail corrisponde per caso a www.formmail.com/ (http://www.formmail.com/)? Perché io non ne ho mai snetito parlare.

Grazie ancora :ciauz:

Loading