Newsgroup: it.comp.lang.perl
Titolo: carattere di fine-linea nella lettura da file (o socket)

Salve,
sto scrivendo un piccolo server tcp in perl, con il modulo IO::Socket:
come si puo` specificare il carattere di fine linea nella lettura del
socket, attraverso l'operatore <> (nel mio caso le linee sono separate
da \0 invece che da \n). So che potrei usare la funzione sysread, ma
preferirei evitarla.
Grazie,
J.

, scriveva:

Variabile $/ ($INPUT_RECORD_SEPARATOR). Non ho mai lavorato con i socket,
ma non mi risulta ci siano differenze rispetto ad un file normale, da
questo punto di vista. Anche IO::Handle->output_record_separator( [STR] )
dovrebbe funzionare, visto che IO::Socket eredita i metodi di IO::Handle.
Ciao.

 Ciao.
Grazie mille! Funziona.
Ciao,
J.

 J.
Non ho capito come useresti sysread per leggere una stringa fino ad un
separatore. la sysread legge un blocco di bytes di dimensione massima
definita, che potrebbe includere piu' "linee" e l' ultima anche troncata.
Tra l' altro per codice di Networking io mi sento di consigliare SOLO
sysread e tutte le funzioni di IO non bufferizzate e che pongano limiti
alle dimensioni dello scalare. Pensa se il tuo fosse un server SMTP o
HTTP e uno ti manda una linea di 2GigaBytes ...
Recentemente ho scritto un automa a stati finiti in Perl per aiutarmi
nell' input da rete.
# $_[0] $instring
# $_[1] "\r\n"
# Restituisce: ($lineatrovata, $resto) o (undef(), $lineaintera)
sub rawin
{
  my $pos = 0;
  if (($pos = index($_[0], $_[1], $pos)) >= 0)
    {
      return ((substr $_[0], 0, $pos),
              (substr $_[0], $pos + length($_[1])));
    }
  else
    { return (undef() , $_[0]); }
}
Un mio progettino che ne fa uso e':
http://www.nongnu.org/rohttpd/
o
http://rohttpd.nongnu.org/
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 J.
Vorrei aggiungere un consiglio sulle scelte degli strumenti per codice
di Networking:
Insieme alla funzione select() (il perl fa casino: alludo alla syscall
per realizzare multiplexer tra piu' connessioni in modo non bloccante)
si puo' usare SOLO il set di funzioni non bufferizzate quindi susread
e syswrite, ecc...
da perldoc -f select
"
    WARNING: One should not attempt to mix buffered I/O (like
    "read" or <FH>) with "select", except as permitted by POSIX,
    and even then only on POSIX systems.  You have to use "sysread"
    instead.
"
Quindi e' un buon investimento sul futuro scegliere un set di strumenti
che permettano uno sviluppo futuro. Non so se lu' uso dei moduli OOP
permetta tutta la flessibilita' possibile poi.
Quanto di piu' complesso ho scritto fin' ora per networking e' questo
framework per bot IRC:
http://cvs.savannah.nongnu.org/viewcvs/?root=rob-bot
(lo so'! non c' e' uno straccio di documentazione. Un giorno spieghero..)
Che va uso intenso della select() per rimanere connesso in maniera
non bloccante con il server IRC e con i pipe con i processi ausiliari
che lanciano gli handlers.
Attenzione che ancora non ho previsto il recupero delle scritture parziali
con syswrite() (come consiglia Stewens). Se il server IRC e' in localhost
non da mai problemi, ma e' da preverede un wrapper a syswrite in seguito.
