Newsgroup: it.comp.lang.perl
Titolo: perl e php, passare parametri

ciao a tutti, ho uno script perl che dovrebbe lanciare un altro file però 
php, come posso fare per passare alcune variabili/parametri dallo script per 
a quello php???
per lanciarlo uso exec 'php nomescript.php'
Simone 


Ah, io l'ho scoperto qualche giorno fa.
E' facile, molto.
Tutti i parametri vengono passati all'inteprete perl tramite la varibile
%ENV
Se fai uno script PHP con questo codice:
<?PHP
phpinfo();
?>
Ti stamperà nella pagina HTML una serie di informazione, tra le quali i
parametri che apache passa all'eseguibile PHP.
Questi sono i parametri che il MIO apache passa a php.exe:
##############################
REDIRECT_STATUS  200
HTTP_ACCEPT  image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, */*
HTTP_ACCEPT_LANGUAGE  it
HTTP_ACCEPT_ENCODING  gzip, deflate
HTTP_USER_AGENT  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR
1.0.3705)
HTTP_HOST  127.0.0.1
HTTP_CONNECTION  Keep-Alive
PATH
E:\\bin;E:\perl\bin;E:\Perl\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\S
ystem32\Wbem;D:\Programmi\ActiveState Komodo 3.0\
SystemRoot  C:\WINDOWS
COMSPEC  C:\WINDOWS\system32\cmd.exe
PATHEXT  .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
WINDIR  C:\WINDOWS
SERVER_SIGNATURE  <address>Apache/2.0.49 (Win32) Server at 127.0.0.1 Port
80</address>
SERVER_SOFTWARE  Apache/2.0.49 (Win32)
SERVER_NAME  127.0.0.1
SERVER_ADDR  127.0.0.1
SERVER_PORT  80
REMOTE_ADDR  127.0.0.1
DOCUMENT_ROOT  E:/apa/site
SERVER_ADMIN  
lords...@virgilio.it
SCRIPT_FILENAME  E:\apa\site\html.php
REMOTE_PORT  3535
REDIRECT_URL  /html.php
GATEWAY_INTERFACE  CGI/1.1
SERVER_PROTOCOL  HTTP/1.1
REQUEST_METHOD  GET
QUERY_STRING  no value
REQUEST_URI  /html.php
SCRIPT_NAME  /html.php
ORIG_PATH_TRANSLATED  E:\apa\site\html.php
ORIG_PATH_INFO  /html.php
ORIG_SCRIPT_NAME  /php/php.exe
ORIG_SCRIPT_FILENAME  C:/php/php.exe
#####################################à
I valori importanti sono ORIG_PATH_TRANSLATED e SCRIPT_FILENAME
che devono contenere l'indirrizzo del file .php .
Infatti non dovrai avviare l'eseguibile php con la riga di comando php.exe
NOME_FILE_PHP
SystemRoot  deve contenere la root del sistema operativo, nel mio caso
C:\windows altrimenti l'eseguibile php non riuscirà a caricare alcune
importanti librerie.
REDIRECT_STATUS deve essere impostato a 200 altrimenti php ti dice che stai
violando una protezione....bla bla bla
CMQ, guardati con calma tutte le varibili.
Per impostare ENV per l'eseguibile php io ho usato questo metodo (esempio):
%mio_env;
$mio_env{'ORIG_SCRIPT_FILENAME'}="E:\\apa\\site\\html.php";
# imposto anche le altre varibili
[..]
# Salvi le vecchie impostazioni in %ENV su una variabile temporanea
my %old_env=%ENV;
# Cambi %ENV con i nuovi parametri
%ENV=%mio_env;
# con la chiamata system ti stampa sulla console il rusultato dello script.
system("C:/php/php.exe");
# Reimposti il vecchio %ENV
%ENV=%old_env;
In questo modo riuscirai a lanciare uno script PHP fingendoti proprio
APACHE!
I prametri passati attraverso il metodo di spedizione GET sono nella
variabile di ENV{'QUERY_STRING'}="ciao=1&casa=mia"; bla bla bla
I parametri passati con il metodo POST.
Difficile a metterlo in pratica.
Questi valori sono passati allo script php tramite l'STDIN.
Forse ti sarà di aiuto una mia FUNZIONE che ho fatto che serve appositamente
per eseguire i CGI:
sub xopen {
my ($exe,$getp,$postd)=@_;
$getp="" unless defined $getp;
my ($writer, $reader,$pagina,$vecchioin); # Dichiaro le variabili
pipe($reader,$writer); # Creo una coppia di pipe per inviare i dati al
processo tramite STDIN
$writer->autoflush(1); # Svuoto il canale
open $vecchioin, "<&", \*STDIN or return undef; # Mi salvo il ref del
vecchio STDIN
open (STDIN, "<&",$reader) or return undef; # Sovrascrivo il ref di STDIN
con la pipe
open (PROG, "$exe $getp |") or return undef; # Avvio il processo aprendo una
pipe in lettura
close $reader; # Chiudo la pipe destinata all'altro processo.
print $writer $postd if defined $postd; # Invio i dati tramite la pipe
all'altro processo
$pagina.=$_ while <PROG>; # Salvo in uno scalare il testo che l'altro
processo produce su STDOUT
close PROG; # Il processo dovrebbe essere già chiuso a questo punto ma di
prassi...
close $writer; # Chiudo la pipe, anche se funzionava quando la lasciavo
aperto
open STDIN, "<&",$vecchioin or die "impossibile aprire STDIN $!\n" if
$vecchioin; # Reimposto il vecchio STDIN :)
# Tutto è nuovamente come prima e torno quello che il processo ha prodotto
:)
return $pagina;
}
I parametri di ingresso di questa sub sono.
my ($exe,$getp,$postd)=@_;
$exe sarà l'eseguibile da lanciare
$getp sono i parametri ricevuti tramite il metodo GET (sui vecchi intepreti
deve essere inserito in ARGV).
$postd sono i dati da inviare all'eseguibile tramite STDIN e sono quelli
ricevuti tramite il metodo POST.
La funzione ritorna direttamente la pagina web creata da php o altri
intepreti.
Ovviamente prima di lanciare la mia funzione devi aver già cambiato tutti i
valori di %ENV.
In con queste funzioni ci ho fatto girare il forum di invision con la
compressione GZIP :D e funzionava perfettamente come su apache.
Buona fortuna e rispondimi se non hai capito un baffo XD
Ciao

grazie infinite... provo lo script cgi anche perchè ho un file perl che deve 
lanciare php con parametri
Simo 

come faccio da perl a impostare i parametri env?
Simone 

 come faccio da perl a impostare i parametri env?
Ma come, te l'ho detto!
Però te di quali parametri parli?
cmq un valore in ENV si imposta.
$ENV{'CHIAVE'}=valore;

grazie, ho risolto!!!
Simo