Newsgroup: it.comp.lang.perl
Titolo: COnoscere il path del file .pl in esecuzione

Buongiorno a tutti,
ho dichiarato in uno script perl una serie di path relativi alla
directory
dove risiede il file stesso.
Come posso sapere  dal programma il path dello scritp?
Il problema sorge se lancio lo script da una directory diversa da
quella dove risiede:
i path relativi vanno tutti a pallino :(
Spero di essere stato chiaro.
Grazie
Ruggero


ci sono sicuramente soluzioni migliori, ma ti mostro la mia
use File::Basename;
my $htmlroot = 'http://'.$ENV{"SERVER_NAME"};
my $sysroot = $ENV{"DOCUMENT_ROOT"};
my $scriptname = $ENV{"SCRIPT_NAME"} ;
my $scriptdirhtml = $htmlroot.dirname($scriptname).'/';
my $scriptdirsys = $sysroot.dirname($scriptname).'/';

 my $scriptdirsys = $sysroot.dirname($scriptname).'/';
Grazie, ma sembra che non funzioni,
il mio script viene eseguito da riga di comando.
Ho provato a vedere cosa contiene %ENV e non vi e' traccia delle
chiavi che menzioni:
foreach my  $key (sort keys %ENV) {
    print "$key:$ENV{$key}\n";
}
DBUS_SESSION_BUS_ADDRESS:unix:abstract=/tmp/dbus-
QNjay75FQu,guid=ccc46ce3c7aa3331debb4e6148145375
DESKTOP_SESSION:default
DISPLAY::0.0
GDMSESSION:default
GDM_LANG:en_US.UTF-8
GDM_XSERVER_LOCATION:local
GNOME_DESKTOP_SESSION_ID:Default
GNOME_KEYRING_PID:6256
GNOME_KEYRING_SOCKET:/tmp/keyring-fiDiDb/socket
GPG_AGENT_INFO:/tmp/seahorse-bM2qsC/S.gpg-agent:6313:1
GTK_RC_FILES:/etc/gtk/gtkrc:/home/roger/.gtkrc-1.2-gnome2
HOME:/home/roger
LANG:en_US.UTF-8
LOGNAME:roger
PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/
games
PWD:/media/KINGSTON/ENISERVIZI/FATTURAZIONE
SESSION_MANAGER:local/roger-804:/tmp/.ICE-unix/6259
SHELL:/bin/bash
SSH_AUTH_SOCK:/tmp/keyring-fiDiDb/ssh
USER:roger
USERNAME:roger
WINDOWPATH:7
XAUTHORITY:/home/roger/.Xauthority
XDG_DATA_DIRS:/usr/local/share/:/usr/share/:/usr/share/gdm/
XDG_SESSION_COOKIE:
64cae36446dfcadbfed51cdd480ced06-1209291635.42427-50560122
Mi scuso se ho fatto qualche errore madornale,
e' circa dieci anni che non uso Perl.
Ruggero


OK ero convinto che tu usassi Perl da server http, ti ho inviato un
esempio CGI.
dovresti risolvere con il seguente:
http://www.perl.com/doc/manual/html/lib/FindBin.html


ho provato il seguente programmino e funziona, nota che usa due metodi
diversi per trovare le informazioni ($0 e FindBin)
use strict;
use warnings;
use FindBin qw($Bin);
use FindBin qw($Script);
use FindBin qw($RealBin);
use FindBin qw($RealScript);
$0=~/^(.+[\\\/])[^\\\/]+[\\\/]*$/;
my $dir= $1 || "./";
print "\$Bin = $Bin\n";
print "\$Script = $Script\n";
print "\$RealBin = $RealBin\n";
print "\$RealScript = $RealScript\n";
print "\$dir = $dir";

 print "\$dir = $dir";
Grzie Oreste,
ma dopo una ricerca su google e vari tentativi sono
approdato a questa soluzione:
use Cwd qw(abs_path);
use File::Basename;
use strict;
#UNIX PROD BASE DIR
my $dir=abs_path($0);
my $BASE_DIR=dirname($dir)."/";
my $BASE_DIR_LOG=$BASE_DIR . "logs/";
Comunque grazie ancora
Ruggero


ottima soluzione, su cpan trovi le specifiche complete
http://search.cpan.org/~kwilliams/PathTools-3.2701/Cwd.pm
Ciao e buon lavoro

 Ciao e buon lavoro
Scusate, ma così ricavate il path della directory *da cui* viene 
invocato lo script, non il path dello script, avete una soluzione per 
quest'ultimo problema?

 quest'ultimo problema?
http://search.cpan.org/~nwclark/perl-5.8.6/lib/FindBin.pm
 riporta il
seguente:
Locates the full path to the script bin directory to allow the use of
paths relative to the bin directory
però anche
KNOWN BUGS ^
If perl is invoked as
   perl filename
and filename does not have executable rights and a program called
filename exists in the users $ENV{PATH} which satisfies both -x and -T
then FindBin assumes that it was invoked via the $ENV{PATH}.
Workaround is to invoke perl as
 perl ./filename
dovrebbe risolvere giusto?

Ciao Oreste
alla fine ho usato il tuo metodo.
Grazie ancora
Ruggero

Oreste ha scritto:

Non è di molto aiuto, se devi invocare lo script da crontab ci sono 
seri problemi	:)