Newsgroup: it.comp.lang.perl
Titolo: server in perl

Salve,
      vorrei far eseguire ad uno script altri script perl passando 
opportuna parametri...il mio server dovrà fare da tramite per questa 
cosa:
diciamo che la seguente sub viene eseguita ogni volta che ricevo una 
connessione:
sub process_request
{
   my $line = <STDIN>;
   ...esegui script per tramite system o altro e cattura l'output in 
$result;
   print STDOUT $result
}
__END__;
$line contiene la prima riga inviata dal client, in questo caso il 
metodo la richiesta ed il protocollo...ora dovrei eseguire la richiesta 
passandola allo script che vado a chiamare tramite system o altro...
come posso passargli dei parametri?? 
grazie

 grazie
Larry, Larry....
dimmi una volta per tutte: ce l' hai installato perldoc?
il pod perldoc perlipc?
visti i tuoi interessi dovresti trovarlo una miniera di buoni consigli.
a me sembra scritto da un devoto di Richard Stevens e infati alla fine
c' e' la citazione alle sue inestimabili opere.
cerca "Bidirectional Communication with Another Process", salta l' esempio
volutamente errato del open(PROG_FOR_READING_AND_WRITING, "| some program
|")
e buon copia/incolla
P.S. attenzione a non usare neanche l' esempio di Comm.pl che si collega
a /dev/tty e quindi puo' controllare si un telnet, ma fa alla velocita'
del terminale (da me 38400 bit/sec)
Usa tutti gli altri esempi, anche quello con socketpair o doppio pipe per
slusso bidirezionale o il frontend a queste tecnologie IPC::Open2;
(attento anche alla bufferizzazione sia lato prog. eseguito che lato
chiamante: I/O NON BUFFERIZZATO!!)
ciao.
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 grazie
sei interessato SOLO all' esecuzione di un sottoprocesso e cattura
dell' output NON al totale controllo del processo figlio imboccandolo
dello standard input e riceverne standard output?
allora ancora piu' semplice:
1) open LS , "/bin/ls -la|";
while($input = <LS>) {print $input;}
o
2)
$input = `/bin/ls -la`;
print $input;
nel secondo caso attento al carattere di quoting. meglio la forma
equivalente
$input = qx(/bin/ls -ls);
print $input;
Ciao


 il pod perldoc perlipc?
gli ho dato una letta e vabbč, ho trovato questo:
use FileHandle;
use IPC::Open2;
$pid = open2(*Reader, *Writer, "cat -u -n" );
print Writer "stuff\n";
$got = <Reader>;
ma quello che volevo dire io č che devo eseguire uno script cgi come gli 
passo le variabili d'ambiente?
dovrei fare:
$pid = open2(*Reader, *Writer, "perl mioscript.cgi" );
ma all'interno di 
mioscript.pl
 ho la 
cgi.pm
 che mi deve raccolgiere 
tutti i dati delle query etc... come glieli passo questi dati??
grazie

 passo le variabili d'ambiente?
Capito.
a prescindere dal metodo che usi per dialogare con il processo figlio
(Open2 ti serve per eseguire CGI che ricevono dati con metodo POST,
ma se non supporti questo metodo puoi usare le altre tecniche
unidirezionali)
perche' il processo figlio riceva un environment settato dal padre dovresti
(non provato) all' interno di un blocco usare local %ENV e settare le
far di ambiente che verranno ereditate dal processo figlio e alla chiusura
della graffa del blocco l' hash %ENV tornera' quella originale
(sara' vero')
es. indicativo. poi faro' prove concrete.
sub lanciaprocesso
{
  local %ENV
# usando gli argomenti di @_ setto coppie nome => valore
#  nella copia locale dell' hash %ENV
$ENV{"miavariabile"} = "valoresoloperCGI";
$outputcgi = qx(echo $miavariabile);
print $outputcgi;


 tutti i dati delle query etc... come glieli passo questi dati??
Ma stai tentando di scriverti un server http?
Se sì, usane uno già bell'e pronto tipo HTTP::Server::Simple (la 
valorizzazione delle variabili d'ambiente da te richiesta è implementata 
  nel modulo HTTP::Server::Simple::CGI::Environment), o almeno dai 
un'occhiata ai sorgenti.
Se invece proprio insisti nel voler fare tutto a manella, puoi ispirarti 
a questo test di CGI.pm:
http://search.cpan.org/src/LDS/CGI.pm-3.25/t/upload.t
Ciao,
Emanuele.

 }
qualche problema con in quoting... ancora non sono riuscito a farlo
funzionare, ma credo che l' approccio per settare l' env in un figlio
sia modificare il proprio prima di fork. non so' con certezza se l' uso
se local %ENV funzionera' e permettera' di rispettare l' env originale
del padre. Comunque ricercherei qui.
Ciao
Roberto.


 > far di ambiente che verranno ereditate dal processo figlio e alla chiusura
{
  local %ENV;
  $ENV{"nomevariabile"} = "valorevariabile";
  $chiave = '$nomevariabile';
  $result = qx(/bin/echo $chiave);
  print $result;
}
$result = qx(/bin/echo $chiave);
print $result;
o anche:
{
  local %ENV;
  $ENV{"nomevariabile"} = "valorevariabile";
  system('/bin/echo $nomevariabile');
}
system('/bin/echo $nomevariabile');
quindi se in un blocco o sub fai una copia locale dell' hash %ENV
con local %ENV e lo modifichi e aggiungi nuove variabili, tale
ambiente viene ereditato dal processo figlio, e fuori dal blocco
l' environmenti viene ripristinato.
la chiave dell' hash %ENV nell' interpretazione del comando shell
diviene il nome della variabile
/bin/echo $nomevariabile
con $nomevariabile da NON considerarsi come scalare Perl, ma come
variabile di environment.
Emanuele Zappieri se puoi, completa tu questa nozione.
ciao.
Roberto


Roberto C wrote:

Mi sembra che abbia già detto tutto tu ;-)
Ciao,
Emanuele.