Newsgroup: it.comp.lang.perl
Titolo: Situazione strana...

situazione strana...
nello scrivere un mio programma perl mi sono imbattuto in una strana
situazione... 
ma prima posto il codice
code:
------------------------------------------------------------------------
#!/usr/bin/perl
#
########################JOIN.CGI [THEARTOFWEBPRODUCTION] ##################
# Load library
use CGI::Carp "fatalsToBrowser"; # Output errors to browser
use CGI;
use Shell qw(date);
use Fcntl qw(DEFAULT :flock);   # Imposta un 'Flock' (UNIX)
$CGI::POST_MAX = 64 * 1024;      # limit post data
$CGI:DISABLE_UPLOADS = 1;       # Disable uploads
my $this_prg = "join.cgi";
my $this_file = $ENV{'SCRIPT_FILENAME'};
   $this_file = ~s/$this_prg//i;
 
open(SCRI,">variabili.txt") || die "bo";
print SCRI $this_file;
close(SCRI);
use lib $this_file."my_lib";     # Aggiunge la dir <my_lib> in @INC
use THEARTOFWEB qw(RANDOM);      # Use random library (THEARTOFWEB)
use THEARTOFMAIL qw(SEND_MAIL);  # Use SEND_MAIL library (THEARTOFWEB);
------------------------------------------------------------------------
allora: 
richiamo un modulo che non ' di default nella dir @INC
per fare ciò metto in $this_file il path dello script in esecuzione
e gli tolgo il nome dello script stesso(in questo caso join.cgi)
cosi' rimane il path assoluto a cui aggiungo poi "my_lib"...ora ho il path
per andare a leggere i miei moduli...
per curiosità stampo in un file il path filtrato ma ottengo in vece di
una stringa uno strano numero.........perche??????

 use lib $this_file."my_lib";     # Aggiunge la dir <my_lib> in @INC
e fare un push (@INC,$my_dir) ?
-- 
$_=q,6;-16;-1;-8;0;7;-13;-12;-9;-3;13#4A75737420616E6F74686572,,($_,$b)=
split?#?;@b=split?;?;map{$c.=$_,$d.=chr$b[$e++]+ord}split??,pack'H24',$b
;chop$d,print$c.chr(32).$d

 
No andrea, questo è un classico errore. Gli 'use' sono valutati durante
la fase di compilazione dello script, quindi prima di eseguire ogni
istruzione. Quindi ogni modifica deve essere fatta a @INC _prima_ di
cominciare l'esecuzione, per esempio in un blocco BEGIN (che ppoi è
proprio ciò che fa il pragma lib). Del resto proprio da li viene il
problema del post originale. Al momento dell'eesecuzione del pragma use
lib e dei successivi 
use THEARTOFWEB qw(RANDOM);      # Use random library (THEARTOFWEB)
use THEARTOFMAIL qw(SEND_MAIL);  # Use SEND_MAIL library (THEARTOFWEB);
$this_file è indefinito. Ci sono (almeno) due soluzioni:
1. Usare un BEGIN block
#!/usr/bin/perl
#
########################JOIN.CGI [THEARTOFWEBPRODUCTION] ##################
# Load library
use CGI::Carp "fatalsToBrowser"; # Output errors to browser
use CGI;
use Shell qw(date);
use Fcntl qw(DEFAULT :flock);   # Imposta un 'Flock' (UNIX)
$CGI::POST_MAX = 64 * 1024;      # limit post data
$CGI::DISABLE_UPLOADS = 1;       # Disable uploads
my $my_lib;
BEGIN {
	my $this_prg = "join.cgi";
        my $this_file = $ENV{'SCRIPT_FILENAME'};
        $this_file = ~s/$this_prg//i;
        $my_lib=$this_file."my_lib";
}
use lib $this_file."my_lib";     # Aggiunge la dir <my_lib> in @INC
use THEARTOFWEB qw(RANDOM);      # Use random library (THEARTOFWEB)
use THEARTOFMAIL qw(SEND_MAIL);  # Use SEND_MAIL library (THEARTOFWEB);
open(SCRI,">variabili.txt") || die "bo";
print SCRI $this_file;
close(SCRI);
2. Se capisco bene, la libreria si trova nella directory my_lib, che è
una sotto-directory di quella in cui si trova lo script. In questo caso è
facile, in @INC, la directory . è 'quella in cui si trova questo file'.
Quindi
#!/usr/bin/perl
#
########################JOIN.CGI [THEARTOFWEBPRODUCTION] ##################
# Load library
use lib qw(./my_lib);
use CGI::Carp "fatalsToBrowser"; # Output errors to browser
use CGI;
use Shell qw(date);
use Fcntl qw(DEFAULT :flock);   # Imposta un 'Flock' (UNIX)
$CGI::POST_MAX = 64 * 1024;      # limit post data
$CGI::DISABLE_UPLOADS = 1;       # Disable uploads
use THEARTOFWEB qw(RANDOM);      # Use random library (THEARTOFWEB)
use THEARTOFMAIL qw(SEND_MAIL);  # Use SEND_MAIL library (THEARTOFWEB);
open(SCRI,">variabili.txt") || die "bo";
print SCRI $this_file;
close(SCRI);
IMHO, la seconda soluzione è molto più elegante:)))
-- 
Leo TheHobbit 
IRCnet #roma2
ICQ 56656060
e-mail: remove 
dont.spam.me
 from above address

 use lib qw(./my_lib);
Infatti. Non funziona su IIS o non su tutte le installazioni, comunque.
Usando FindBin dovrebbe essere piu' portabile:
use FindBin qw($Bin);
use lib "$Bin/my_lib";
---
Mario Rizzuti
http://www.smixer.com