index | project | pods | responsabili

NOME

perlrun - come eseguire l'interprete Perl


SINOSSI

perl-sTtuUWX ]
-hv ] [ -V[:configvar] ]
-cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
-pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]
-Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ]
-C [number/list]
-P ]
-S ]
-x[dir] ]
-i[extension] ]
-e 'command' ] [ -- ] [ programfile ] [ argument ]...


DESCRIZIONE

La maniera usuale di eseguire un programma Perl è quella di renderlo direttamente eseguibile, o altrimenti passando il nome del file sorgente come un argomento sulla linea di comando. (È anche possibile un ambiente Perl che sia interattivo--si veda perldebug per i dettagli su come farlo). In fase di avvio, Perl cerca il vostro programma in uno dei seguenti posti:

  1. Specificato linea per linea tramite lo switch -e sulla linea di comando.

  2. Contenuto nel file specificato dal primo nome del file sulla linea di comando. (Va notato che sistemi che supportano la notazione #! invocano l'interprete in questo modo. Si veda La posizione di Perl).

  3. Passato implicitamente attraverso standard input. Questo funziona solamente se non ci sono nomi di file come argomento--per passare argomenti ad un programma che legge da STDIN dovete esplicitamente specificare un ``-'' per il nome del programma.

Con i metodi 2 e 3, Perl inizia a fare il parsing del file di input dall'inizio, a meno che non abbiate specificato uno switch -x, nel qual caso cerca la prima linea che inizia con #! e che contiene la parola ``perl'', e quindi inizia da lì. Questo è utile per eseguire un programma integrato in un messggio più ampio. (In questo caso indichereste la fine del programma utilizzando il simbolo __END__).

La linea #! viene comunque esaminata per trovare degli switch durante il parsing della stessa. Quindi, se siete su una macchina che permette solamente un argomento con la linea #!, o peggio ancora, se nemmeno riconosce la linea #!, potete ancora ottenere un comportamento consistente con gli switch senza curarvi di come Perl sia stato invocato, anche se è stato utilizzato -x per trovare l'inizio del programma.

Dato che storicamente alcuni sistemi operativi tagliano silenziosamente fuori l'interpretazione da parte del kernel della linea #! dopo i 32 caratteri, alcuni switch potrebbero esser passati sulla linea di comando e altri no; potreste anche ottenere un ``-'' senza la sua lettera, se non fate attenzione. Probabilmente volete esser sicuri che tutti i vostri switch ricadano o prima o dopo il limite dei 32 caratteri. Molti switch non tengono conto del fatto di esser processati ridondantemente, ma ottenere un ``-'' invece di uno switch completo potrebbe far sì che Perl cerchi di eseguire lo standard input invece del vostro programma. E uno switch parziale come -I potrebbe anch'esso causare dei risultati bizzarri.

Alcuni switch tengono conto del fatto di esser stati processati due volte, per esempio combinazioni di -l e -0. Quindi o si mettono tutti gli switch dopo il limite dei 32 caratteri (se possibile), oppure si rimpiazza l'uso di -0cifre con BEGIN{ $/ = "\0cifre"; }.

Il parsing dello switch #! inizia ovunque ``perl'' viene menzionato nella linea. Le sequenze ``-*'' e ``- '' sono specificatamente ignorate così che possiate, se foste così inclini a farlo, dire

    #!/bin/sh -- # -*- perl -*- -p
    eval 'exec perl -wS $0 ${1+"$@"}'
        if $in_esecuzione_in_una_qualche_shell;

per permettere che Perl veda lo switch -p.

Un trucco simile coinvolge il programma env, se lo avete.

    #!/usr/bin/env perl

Gli esempi sopra usano un percorso relativo all'interprete perl, ottenendo qualunque versione compaia per prima nel path dell'utente [``percorso nel quale vengono cercati i file eseguibili'', N.d.T.]. Se volete una specifica versione di Perl, diciamo, perl5.005_57, dovreste posizionarlo direttamente nel path della linea #!.

Se la linea #! non contiene la parola ``perl'', invece dell'interprete Perl viene eseguito il programma chiamato dopo la #!. Questo è un po' bizzarro, ma aiuta le persone su macchine in cui non funziona #!, perché possono dire al programma che la loro SHELL è /usr/bin/perl, e quindi Perl invierà il programma all'interprete corretto.

Dopo aver localizzato il vostro programma, Perl compila l'intero programma in un formato interno. Se ci sono degli errori di compilazione, l'esecuzione del programma non viene tentata. (Questo è diverso dal tipico comportamento di uno script shell, il quale potrebbe essere in parte eseguito prima di trovare un errore di sintassi).

Se il programma è sintatticamente corretto, viene eseguito. Se il programma viene eseguito fino alla fine senza incontrare un operatore exit() o die(), viene fornito implicitamente un exit(0) per indicare un completamento con successo.

#! e il quoting su sistemi non-Unix

La tecnica #! usata in Unix può esser simulata in altri sistemi:

OS/2
Mettete
    extproc perl -S -i_vostri_switch

come prima linea nei file *.cmd (-S a causa di un bug nella gestione di 'extproc' da parte di cmd.exe).

MS-DOS
Create un file batch per eseguire il vostro programma, e codificatelo in ALTERNATE_SHEBANG (vedete il file dosish.h nella distribuzione sorgente per maggiori informazioni).

Win95/NT
L'installazione in Win95/NT, quando si utilizza l'installatore ActiveState per Perl, modificherà il registro di Windows per associare l'estensione .pl con l'interprete perl. Se installate Perl con altri intenti (incluso il compilarlo da sorgenti), potreste dover modificare voi stessi il registro. Notate che questo significa che non potete più dire quale sia la differenza tra un programma eseguibile Perl e una libreria Perl.

Macintosh
Sotto il ``classico'' MacOS, un programma perl avrà il Creator e il Type appropriati, così che facendoci doppio click, invocheranno l'applicazione MacPerl. Sotto Mac OS X, le applicazioni cliccabili possono esser fatte da un qualsiasi script del tipo #! usando DropScript, l'utility di Wil Sanchez: http://www.wsanchez.net/software/ .

VMS
Mettete
    $ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
    $ exit++ + ++$status != 0 and $exit = $status = undef;

in cima al vostro programma, dove -mysw sono qualasiasi switch da linea di comando vogliate passare a Perl. Potete ora invocare il programma direttamente, dicendo perl program, o come una procedura DCL, dicendo @program (o implicitamente via DCL$PATH utilizzando semplicemente il nome del programma).

Questo incantesimo è un po' troppo da ricordare, ma Perl ve lo mostrerà se dite perl "-V:startperl".

Gli interpreti su sistemi non-Unix hanno delle idee piuttosto differenti sul come quotare rispetto alle shell Unix. Avrete bisogno di imparare i caratteri speciali nel vostro interprete (*, \ e " sono comuni) a come proteggere gli spazi bianchi a questi caratteri per eseguire i programmi su singola linea (oneliner) (vedete -e sotto).

In alcuni sistemi, potreste dover cambiare i quote singoli in quelli doppi, che non dovete fare in sistemi Unix o Plan 9. Potreste anche dover cambiare un singolo % in due %%.

Per esempio:

    # Unix
    perl -e 'print "Hello world\n"'
    # MS-DOS, ecc.
    perl -e "print \"Hello world\n\""
    # Macintosh
    print "Hello world\n"
     (poi Run "Myscript" or Shift-Command-R)
    # VMS
    perl -e "print ""Hello world\n"""

Il problema è che nessuno di questi è affidabile: dipende dal comando ed è completamente possibile che nemmeno funzioni. Se 4DOS fossero comandi di shell, questo probabilmente funzionarebbe meglio:

    perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

CMD.EXE ha fatto scivolare dentro WindowsNT molte delle funzionalità Unix standard quando nessuno le stava cercando, cercate di trovare documentazione per capire le sue regole di quoting.

Sotto Macintosh, dipende da che ambiente state utilizzando. La shell MacPerl, o MPW, è più simile alle shell Unix nel suo supporto per molte varianti di quoting, eccetto che fa uso libero dei caratteri non-ASCII Macintosh come caratteri di controllo.

Non c'è una soluzione generale a tutto questo. È solo un casino.

La posizione di Perl

Potrebbe sembrare ovvio da dire, ma Perl è utile solo quando gli utenti possono trovarlo facilmente. Quando possibile, è cosa buona per entrambi /usr/bin/perl e /usr/local/bin/perl che siano dei link al vero binario. Se questo non può esser fatto, gli amministratori di sistema sono fortemente incoraggiati a mettere (creare link) perl e le utility a lui annesse in una directory che si trova tipicamente nel PATH dell'utente, o in qualche altro posto ovvio e conveniente.

In questa documentazione, #!/usr/bin/perl sulla prima linea del programma farà le veci di qualunque metodo funzioni nel vostro sistema. Siete invitati ad usare un path specifico se volete una versione specifica.

    #!/usr/local/bin/perl5.00554

oppure se volete solamente aver l'ultima versione funzionante, piazzate una istruzione come questa all'inizio del vostro programma:

    use 5.005_54;

Command Switches [?][mi rifiuto]

Così come con tutti i comandi standard, uno switch costituito da un singolo carattere potrebbe esser raggruppato con il seguente switch.

    #!/usr/bin/perl -spi.orig   # lo stesso di -s -p -i.orig

Gli switch includono:

-0[octal/hexadecimal]
specifica il separatore del campo di input ($/) come un numero ottale o esadecimale. Se non ci sono numeri, il carattere nullo è il separatore. Altri switch potrebbero precedere o seguire i caratteri. Per esempio, se avete una versione di find che può stampare i nomi di file terminati dal carattere nullo, potete dire la seguente cosa:
    find . -name '*.orig' -print0 | perl -n0e unlink

Il valore speciale 00 farà sì che Perl si legga i file in modalità paragraph[?]. Il valore 0777 farà sì che Perl si legga i file completamente perché non c'è un byte legale con quel valore.

Se volete specificare un qualunque carattere Unicode, usate il formato esadecimale: -0xHHH..., dove H sono cifre esadecimali valide. (Questo significa che non potete usare -x con un nome di directory che consiste di numeri esadecimali).

-a
accende la modalità autosplit quando viene utilizzato con un -n o -p. Viene eseguito un comando implicito di split nell'array @F come prima cosa dentro il ciclo while implicito prodotto da -n o -p.
    perl -ane 'print pop(@F), "\n";'

è equivalente a

    while (<>) {
        @F = split(' ');
        print pop(@F), "\n";
    }

Un delimitatore alternativo potrebbe esser specificato utilizzando -F.

-C [number/list]
Il -C flag controlla alcune delle caratteristiche Unicode di Perl.

A partire dalla versione 5.8.1, -C può esser seguito o da un numero o da una lista di opzioni letterali. Le lettere, i loro valori numerici, e gli effetti sono i seguenti; listing[?] le lettere è uguale a sommare i numeri. [As of 5.8.1, the -C can be followed either by a number or a list of option letters. The letters, their numeric values, and effects are as follows; listing the letters is equal to summing the numbers.]

    I     1    STDIN e` assunto essere in UTF-8
    O     2    STDOUT sara`  in UTF-8
    E     4    STDERR sara`  in UTF-8
    S     7    I + O + E
    i     8    UTF-8 e` il strato di default PerlIO strato per gli stream in ingresso
    o    16    UTF-8 e` il PerlIO di default per gli stream in uscita
    D    24    i + o
    A    32    the @ARGV elements are expected to be strings encoded in UTF-8
    A    32    gli elementi di @ARGV son supposti essere delle stringhe codificate in UTF-8
    L    64    normally the "IOEioA" are unconditional,
    L    64    normalmente gli "IOEioA" sono incondizionali
               la L li rende condizionali per le variabili d'ambienti locali
               (LC_ALL, LC_TYPE, e LANG, in ordine decrescente di precedenza)
                -- se le variabili indicano UTF-8m allora le "IOEioA"
               selezionati sono in funzione

Per esempio, -COE e -C6 metteranno entrambi in funzione UTF-8 su entrambi STDOUT e STDERR. Ripetere le lettere è ridondente, non sono cumulative e nemmeno alternanti.

Le opzioni io significano che qualsiasi open() a seguire (oppure operazioni di IO simili) avranno il strato :utf8 PerlIO implicitamente applcato ad esse, in altre parole, ci si aspetta UTF-8 da qualsiasi altro stream in ingresso, e UTF-8 viene prodotto per qualsiasi stream in uscita. Questa vale come default, con strato espliciti in open() e binmode() si possono manipolare gli stream come al solito.

-C di suo (non seguito da nessun numero o lista di opzioni), o la stringa vuota "" per la variabile d'ambiente PERL_UNICODE, ha gli stessi effetti di -CSDL. In altre parole, lo standard I/O gestisce e il strato di default open() sono UTF-izzati ma solo le variabili d'ambiente locali indicano un locale UTF-8. Questo comportamento segue l'implicito (e problematico) comportamento UTF-8 di Perl 5.8.0.

Potete usare -C0 (o "0" per PERL_UNICODE) per disabilitare esplicitamente tutte le caratteristiche sopra descritte riguardo Unicode.

La magica variabile in sola-lettura ${^UNICODE} riflette il valore numerico di questo settaggio. Questa variabile viene settata durante l'avvio di Perl e dopo è quindi disponibile in sola-lettura. Se volete degli effetti a tempo di esecuzione, usate la open() con tre argomenti (vedete perlfunc/open), binmode() con due argomenti (vedete perlfunc/binmode), e la direttiva open (vedete open).

(Nelle versioni di Perl precedenti alla 5.8.1, lo switch -C) era uno switch relativo solamente a Win32 che abilitava l'uso di ``ampie system call'' Win32 API consapevoli della codifica Unicode. Questa caratteristica era praticamente inutilizzata, comunque, e la linea di comanda era quindi ``ricliclata'').

-c
fa in modo che Perl controlli la sintassi del programma e che dopo esca senza eseguirlo. Veramente, lui eseguirà i blocchi BEGIN, CHECK, e use, perché questi sono considerati come esser al di fuori dell'esecuzione del programma. I blocchi INIT e END, comunque, saranno saltati.

-d
-dt
fa girare il programma sotto il debugger Perl. Si veda perldebug. Se t viene specificato, indica al debugger che verranno utilizzati i threads nel codice che si sta debuggando.

-d:foo[=bar,baz]
-dt:foo[=bar,baz]
esegue il programma sotto il controllo di un modulo di debugging, profiling, o tracing installacome come Devel::foo E.g., -d:DProf esegue il programma utilizzando il profiler Devel::DProf. Come con il flag -M, potrebbero esser passate opzioni al package Devel::foo dove saranno ricevute e interpretate dalla routine Devel::foo::import. La lista di opzioni separata da virgola deve seguire un carattere =. Se t viene specificato, indica al debugger che verranno utilizzati i thread nel codice che si sta debuggando. Si veda perldebug.

-Dletters
-Dnumber
setta i flag di debugging. Per guardare come viene eseguito il vostro programma, usate -Dtls. (Questo funziona solamente se 'debugging' è compilato nel vostro Perl.) Un altro bel valore e' -Dx, il quale mostra la lista del vostro albero sintattico compilato. E -Dr mostra le espressioni regolari compilate; il formato dell'output e' spiegato in perldebguts.

Come alternativa, specificate un numbero invece di una lista di lettere (ad es., -D14 è equivalente a -Dtls):

        1  p  Tokenizing and parsing
        2  s  Stack snapshots (with v, displays all stacks)
        4  l  Context (loop) stack processing
        8  t  Trace execution
       16  o  Method and overloading resolution
       32  c  String/numeric conversions
       64  P  Print profiling info, preprocessor command for -P, source file input state
      128  m  Memory allocation
      256  f  Format processing
      512  r  Regular expression parsing and execution
     1024  x  Syntax tree dump
     2048  u  Tainting checks
     4096     (Obsolete, previously used for LEAKTEST)
     8192  H  Hash dump -- usurps values()
    16384  X  Scratchpad allocation
    32768  D  Cleaning up
    65536  S  Thread synchronization
   131072  T  Tokenising
   262144  R  Include reference counts of dumped variables (eg when using -Ds)
   524288  J  Do not s,t,P-debug (Jump over) opcodes within package DB
  1048576  v  Verbose: use in conjunction with other flags
  8388608  q  quiet - currently only suppresses the "EXECUTING" message

Tutti questi flag richiedono -DDEBUGGING quando compilate il vostro eseguibile Perl (ma vedete the Devel::Peek manpage, re che potrebbero cambiare questo). Si veda anche il file INSTALL nella distribuzione del codice sorgente Perl per come fare questo. Questo flag è impostato automaticamente se includete l'opzione -g quando Configure vi chiede riguardo i flag optimizer/debugger.

Se state solamente provando ad ottenere la stampa di ciascuna linea di codice Perl come esso viene eseguito, il modo che sh -x fornisce per gli shell script, non potete usare lo switch Perl -D. Invece fate così

  # Se avete l'utility "env"
  env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
  # Sintassi della shell Bourne
  $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
  # Sintassi csh
  % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)

Si veda perldebug per dettagli e variazioni.

-e commandline
potrebbe essere usato per avere un programma di una linea. Se -e viene dato, Perl non cercherà per un nome di file nella lista degli argomenti. -e multipli potrebbero esser dati sulla stessa linea di comando per costruire uno script multi-linea. Assicuratevi di usare il 'punto e virgola' laddove lo mettereste usualmente in un normale programma.

-f
Disabilitato eseguendo $Config{sitelib}/sitecustomize.pl all'avvio.

Perl può esser compilato in maniera che di default esso cercherà di eseguire $Config{sitelib}/sitecustomize.pl all'avvio. Questo è un aggancio che permette agli amministratori di sistema di personalizzare come perl si comporta. Esso può per esempio essere usato per aggiungere dei valori all'array @INC per fare in modo che perl trovi i moduli in locazioni non-standard.

-Fpattern
specifica il pattern con il quale eseguire lo split se anche -a viene utilizzato. Il pattern potrebbe esser circondato da //, "", o '', altrimenti verrà messo in apici singoli. Non potete utilizzare spazi bianchi letterali nel pattern.

-h
stampa un sommario delle opzioni.

-i[extension]
specifica che i file processati dal costrutto <> devono esser editati sul posto. Questo viene fatto rinominando il file in input, aprendo il file di output con il nome originale, e selezionando quel file di output come quello di default per le istruzioni di print(). L'estensione, se fornita, viene usata per modificare il nome del vecchio file per eseguire una copia di backup, seguite queste regole:

se non è stata fornita un'estensione, non viene fatto alcun backup e il file corrente viene sovrascritto.

Se l'estensione non contiene *, allora essa viene appesa alla fine del nome di file corrente come un suffisso. Se l'estensione contiene uno o più caratteri *, allora ciascun * viene rimpiazzato con il nome di file corrente. In termini Perlistici, potreste pensare a questa cosa come:

    ($backup = $extension) =~ s/\*/$file_name/g;

Questo vi permette di aggiungere un prefisso al file di backup, invece di (o in aggiunta a) un suffisso:

    $ perl -pi'orig_*' -e 's/bar/baz/' fileA    # backup to 'orig_fileA'

O anche di posizionare delle copie di backup dei file originali in un'altra directory (ammesso che la directory già esista):

    $ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to 'old/fileA.orig'

Questi insiemi di one-liners (programmi su una linea, NdT) sono equivalenti:

    $ perl -pi -e 's/bar/baz/' fileA            # sovrascrive il file corrente
    $ perl -pi'*' -e 's/bar/baz/' fileA         # sovrascrive il file corrente
    $ perl -pi'.orig' -e 's/bar/baz/' fileA     # esegue backup in 'fileA.orig'
    $ perl -pi'*.orig' -e 's/bar/baz/' fileA    # esegue backup in 'fileA.orig'

Dalla shell dire:

    $ perl -p -i.orig -e "s/foo/bar/; ... "

è la stessa cosa che usare il programma:

    #!/usr/bin/perl -pi.orig
    s/foo/bar/;

il quale è a

    #!/usr/bin/perl
    $extension = '.orig';
    LINE: while (<>) {
        if ($ARGV ne $oldargv) {
            if ($extension !~ /\*/) {
                $backup = $ARGV . $extension;
            }
            else {
                ($backup = $extension) =~ s/\*/$ARGV/g;
            }
            rename($ARGV, $backup);
            open(ARGVOUT, ">$ARGV");
            select(ARGVOUT);
            $oldargv = $ARGV;
        }
        s/foo/bar/;
    }
    continue {
        print;  # this prints to original filename
    }
    select(STDOUT);

eccetto che la forma -i non ha bisogno di confrontare $ARGV con $oldargv per sapere quando il nome di file è stato cambiato. Comunque, esso usa ARGVOUT per il filehandle selezionato. Notate che STDOUT viene ripristinato come il filehandle di default per l'output dopo il ciclo.

Come mostrato sopra, Perl crea il file di backup sia che qualsiasi output sia stato realmente cambiato o no. Così questo è solamente un modo elaborato per copiare dei file:

    $ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
o
    $ perl -p -i'.orig' -e 1 file1 file2 file3...

Potete usare eof senza parentesi per localizzare la fine di ciascun input file, nel caso vogliate appendere a ciuascun file, o resettare l'enumerazione delle linea (vedete gli esempi in perlfunc/eof).

Se, per un dato file, Perl non è capace di creare un file di backup come specificato nell'estensione allora lui salterà quel file e continuerà con il prossimo (se esiste).

Per una discussione sui problemi di contorno riguardo i permessi sui file e -i vedetevi perlfaq5/Perché il Perl mi permette di cancellare file di sola lettura? Perché -i sovrascrive i file protetti? Non è un bug del Perl?

Non potete usare -i per creare directory o per eliminare estensioni dai file.

Perl non espande ~ nei nomi di file, il che è buono, dato che alcuni personaggi lo usano per eseguire i loro backup di file

    $ perl -pi~ -e 's/foo/bar/' file1 file2 file3...

Notate che siccome -i rinomina o cancella il file originale prima di crearne uno uguale con lo stesso nome di file, i link soft/hard UNIX-style non vengono preservati.

Alla fine, lo switch -i non impedisce l'esecuzione quando non vengono dati file sulla linea di comando. In questo caso, non viene eseguito alcun backup (il file originale non può, naturalmente, esser determinato) e l'esecuzione procede da STDIN a STDOUT così come ci si aspetterebbe.

-Idirectory
Le directory specificate con -I sono preposte nel percorso di ricerca per i moduli (@INC), ed esso dice anche al preprocessore C dove andare a cercare per includere i file. Il preprocessore C è invocato con -P; di default esso va a cercare in /usr/include e /usr/lib/perl.

-l[octnum]
abilita l'elaborazione automatica del fine-linea. Esso ha due effetti separati. Primo, taglia automaticamente $/ (il separatore dell'input record) quando viene utilizzato con -n o -p. Secondo, esso assegna $\ (il separatore dell'output record) in modo che abbia il valore di octnum così che qualsiasi istruzione di print avrà quel separatore aggiunto alla fine. Se octnum viene omesso, viene impostata $\ al valore corrente di $/. Per esempio, per tagliare le linee ad 80 colonne:
    perl -lpe 'substr($_, 80) = ""'

Notate che l'assegnamento di $\ = $/ viene fatto quando lo switch viene processato, quindi il separatore di input record può esser differente rispetto a quello di output se lo switch -l è seguito dallo switch -0:

    gnufind / -print0 | perl -ln0e 'print "found $_" if -p'

Questo imposta $\ a un carattere di newline e quindi imposta $/ al carattere nullo.

-m[-]module
-M[-]module
-M[-]'module ...'
-[mM][-]module=arg[,arg]...
-mmodule esegue use module (); prima di eseguire il vostro programma.

-Mmodule exegue use module ; prima di eseguire il vostro programma. Potete usare le virgolette per aggiungere ulteriore codice dopo il nome del modulo, e.g., '-Mmodule qw(foo bar)'.

Se il primo carattere dopo -M o -m e' un dash (-) allora 'use' viene rimpiazzato con 'no'.

Un piccolo zuccherino sintattico builtin significa che potete anche dire qualcosa come -mmodule=foo,bar or -Mmodule=foo,bar come scorciatoia per '-Mmodule qw(foo bar)'. Questo aggira il bisogno di utilizzare le virgolette quando si importano i simboli. Il vero codice generato da -Mmodule=foo,bar è use module split(/,/,q{foo,bar}). Notate che la forma = rimuove la distinzione tra -m e -M.

Una conseguenza di questo è che -MFoo=number non esegue mai un controllo sulla versione (a meno che Foo::import() stesso sia settato per eseguire un controllo di questo tipo, il quale potrebbe accedere per esempio se Foo eredita da Exporter.)

-n
fa in modo che Perl assuma il seguente ciclo intorno al vostro programma, il quale fa in modo che esso iteri sopra gli argomenti del nome di file in qualche modo come sed -n o awk:
  LINE:
    while (<>) {
        ...             # il vostro programma va qui
    }

Notate che le linee non vengono stampate di default. Si veda -p per avere le linee stampate. Se un file nominato da un argomento non può esser aperto per qualche ragione, Perl vi avvertirà al riguardo e si sposterà al file successivo.

Ecco un modo efficiente per cancellare tutti i file che non sono stati modificati per almeno una settimana:

    find . -mtime +7 -print | perl -nle unlink

Questo è più che usare lo switch -exec di find perché non dovete eseguire un processo su ogni file trovato. Esso soffre del bug di maltrattare i caratteri di 'nuova linea' nel percorso del file, cosa che potete sistemare se seguite l'esempio sotto -0.

I blocchi BEGIN e END potrebbero esser usati per ottenere controllo prima o dopo il ciclo implicito del programma, proprio come in awk.

-p
fa in modo che Perl assuma ci sia il seguente intorno al vostro program, il quale fa si che esso iteri sui nomi di file che gli avete passato come argomento un po' come sed:
  LINE:
    while (<>) {
        ...             # il vostro programma va qui
    } continue {
        print or die "-p destinazione: $!\n";
    }

Se un file passato come argomento non può essere aperto per qualche ragione, Perl vi avvertirà al riguardo, e procederà oltre al file successivo. Notate che le linee sono stampate automaticamente. Un errore che occorra durante la stampa viene trattato come fatale. Se non volete stampare utilizzate lo switch -n. Uno switch -p sovrascrive un -n.

I blocchi BEGIN e END potrebbero essere utilizzati per avere controllo prima o dopo il ciclo implicito, giusto come in awk.

-P
NOTATE: L'utilizzo di -P è fortemente sconsigliato a causa dei problemi che si porta dietro, inclusa la poca portabilità.

Questa opzione fa in modo che il vostro programma venga eseguito tramite il pre-processore C prima che avvenga la compilazione da parte di Perl. Dato che entrambi i commenti in Perl e le direttive cpp in C++ iniziano con il carattere #, dovreste cercare di evitare di iniziare i commenti con qualsiasi parola possa esser riconosciuta dal pre-processore C come "if", "else", o "define".

Se state considerando la possibilit à di utilizzare -P, potreste anche voler guardare al modulo Filter::cpp disponibile su CPAN.

I problemi di -P includono, ma non sono limitati a:

  • La linea che inizia con #! viene tolta, così che qualsiasi switch non funzioni

  • Un -P su una linea con #! non funziona.

  • Tutte le linee che iniziano con (spazio bianco e) un # ma non assomigliano a comandi C++, vengono tolte, incluso qualsiasi cosa dentro stringhe Perl, espressioni regolari, e documentazione.

  • Su alcune piattaforme il pre-processore C ne sa troppe: capisce dallo stile C++ fino ai commenti a afine linea che iniziano con "//". Questo provocherà problemi con costrutti comuni in Perl come
        s/foo//;

    perché dopo -P questo diventerà codice non valido

        s/foo

    Per aggirare questo problema si devono usare altri separatori per il quoting anziché "/", come per esempio "!":

        s!foo!!;

  • Esso richiede non solo un pre-processore C funzionante ma anche un sed che funzioni. Se non siete in UNIX, probabilmente siete sfortunati per questa cosa.

  • I numeri di linea dello script non vengono conservati.

  • Lo switch -x non funziona con -P.

-s
abilita un parsing di tipo rudimentale per gli switch sulla linea di comando dopo il nome del programma ma prima degli argomenti di nome di file (o prima di un argomento tipo --). Qualunque switch trovato lì viene rimosso da @ARGV e imposta la variabile corrispondente nel programma Perl. Il seguente programma stampa ``1'' se viene invocato con uno switch -xyz, e ``abc'' se viene invocato con -xyz=abc.
    #!/usr/bin/perl -s
    if ($xyz) { print "$xyz\n" }

Notate che uno switch come --help crea la variabile ${-help}, che non è compatibile con strict refs. Ancora, quando utilizzate questa opzione in uno script con gli avvertimenti abilitati potreste ottenere tanti ``used only once'' avvertimenti.

-S
fa si che Perl utilizzi la variabile d'ambiente PATH per cercare il programma (a meno che il nome del programma contenga dei separatori di directory).

Su alcune piattaforme, questo fa in modo che Perl appenda dei suffissi al nome del file mentre sta cercando per lui. Per esempio, su piattaforma Win32, vengono appese le estensioni ``.bat'' e ``.cmd'' se la ricerca per il nome del file originario fallisce, e se il nome non finisce già con uno di quelli. Se il vostro Perl era stato compilato con il DEBUGGING abilitato, usando lo switch -Dp mostra come la ricerca procede.

Tipicamente questo viene utilizzato per emulare lo #! su piattaforme che non lo supportano. È anche conveniente quando si esegue il debugging di uno script che utilizza #! e è quindi trovato normalmente dal meccanismo di ricerca della shell che usa la variabile d'ambiente $PATH.

Questo esempio funziona su molte piattaforme che hanno una shell compatibile con la Bourne shell:

    #!/usr/bin/perl
    eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
            if $girando_in_qualche_shell;

Il sistema ignora la prima linea e passa il programma a /bin/sh, che procede provando ad eseguire il programma Perl come uno shell script. La shell esegue la seconda linea come un normale comando di shell, e quindi fa partire l'interprete Perl. Su alcuni sistemi $0 non contiene sempre il path del nome completo, così -S dice a Perl di cercare per il programma se è necessario. Dopo che Perl ha localizzato il programma, parsa le linee e le ignora perché la variabile $running_under_some_shell non è mai vera. Se il programma sarà interpretato da csh, avrete bisogno di rimpiazzare ${1+"$@"} con $*, anche se lui non capisce gli spazi (e simili) nella lista degli argomenti. Per far partire sh anziché csh, in alcuni sistemi potrebbe esser necessario rimpiazzare la linea con #! con una linea che contenga solamente una virgola, la quale verrà gentilmente ignorata da Perl. Altri sistemi non possono aver controllo su questo, e necessitano un costrutto completamente contorto che funzionerà in qualsiasi csh, sh, o Perl, come il seguente:

        eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
        & eval 'exec /usr/bin/perl -wS $0 $argv:q'
                if $running_under_some_shell;

Se il nome di file fornito contiene dei separatori di directory (i.e., è un pathname assoluto o relativo), e se quel file non viene trovato, le piattaforme che appendono l'estensione del file alla fine lo faranno e cercheranno i file con quelle estensioni che sono state aggiunte, uno per uno.

Su piattaforme DOS-like, se il programma non contiene separatori di directory, verrà prima di tutto cercato nella directory corrente prima di venir cercato nel PATH. Su piattaforme Unix, il programma verrà esclusivamente nel PATH.

-t
Come -T, ma i controlli ``taint checks'' stamperanno degli avvertimenti anziché produrre errori fatali. Questi avvertimenti possono esser controllati normalmente con no warnings qw(taint).

NOTA: questo non è un sostituto per -T. Questo è inteso essere usato solo come aiuto temporaneo durante lo sviluppo mentre si mette al sicuro codice legacy (NdT. vecchio codice lasciato in eredità): per vero codice di produzione e per nuovo codice sicuro scritto da zero, usate sempre il vero -T.

-T
forza l'abilitazione dei controlli ``taint checks'' così che potete testarli. Normalmente questi controlli vengono eseguiti solamente quando il programma viene useguito con setuid o setgid. È una buona idea utilizzare questi controlli esplicitamente per programmi che girano con i diritti di qualcun altro di cui potreste necessariamente non fidarvi, come programmi CGI o qualsiasi altro server internet che potreste scrivere in Perl. Si veda perlsec per dettagli. Per ragioni di sicurezza, questa opzione deve esser vista da Perl abbastanza presto; normalmente questo significa che deve comparire presto sulla linea di comando o nella linea #! per quei sistemi che supportano quel costrutto.

-u
Questo switch obsoleto fa in modo che Perl esegua il coredump dopo aver compilato il vostro programma. In teoria poi, potete prendere questo coredump e convertirlo in un file eseguibile utilizzando il programma undump (non fornito). Questo velocizza l'avvio al costo di un po' di spazio su disco (che potete minimizzare snellendo l'eseguibile). (Ancora, un file eseguibile con un ``hello world'' viene ad essere intorno ai 200K sulla mia macchina.) Se volete eseguire una porzione del vostro programma prima di eseguire il dump, utilizzate invece l'operatore dump(). Nota: la disponibilità di undump è specifica della piattaforma e potrebbe non esser disponibile per un port specifico di Perl.

Questo switch è stato sostituito in favore del nuovo backend disponibile nel compilatore. Si veda B e the B::Bytecode manpage per i dettagli.

-U
permette a Perl di eseguire operazioni non sicure. Attualmente le sole operazioni non sicure sono quelle che cercano di cancellare directory quando il programma gira con il privilegio di superuser, e quando girano programmi con setuid con i controlli ``taint checks'' cambiati in avvertimenti. Notate che lo switch -w (o la variabile $^W) deve esser utilizzato con questa opzione per generare veramenete gli avvertimenti taint-check.

-v
stampa la versione e il livello di patch del vostro eseguibile perl.

-V
stampa un sommario della maggior parte dei valori di configurazione di perl e il valore corrente di @INC.

-V:configvar
Stampa su STDOUT il valore della/e variabile/i di configurazione, con multipli quando gli argomenti delle vostre variabili di configurazione sembrano come delle espressioni regolari (non hanno lettere). Per esempio:
    $ perl -V:libc
        libc='/lib/libc-2.2.4.so';
    $ perl -V:lib.
        libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
        libc='/lib/libc-2.2.4.so';
    $ perl -V:lib.*
        libpth='/usr/local/lib /lib /usr/lib';
        libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
        lib_ext='.a';
        libc='/lib/libc-2.2.4.so';
        libperl='libperl.a';
        ....

In più , due punti aggiuntivi possono esser utilizzati per controllare la formattazione. I due punti dietro sopprimono il linefeed e il terminatore ';', permettendovi di integrare delle richieste dentro dei comandi di shell. (mnemonicamente: separatore di PATH ':'.)

    $ echo "compression-vars: " `perl -V:z.*: ` " are here !"
    compression-vars:  zcat='' zip='zip'  are here !

I due punti davanti rimuovono la parte 'name=' della risposta, questo vi permette di fare il mapping al nome di cui avete bisogno (mnemonicamente: etichetta vuota)

    $ echo "goodvfork="`./perl -Ilib -V::usevfork`
    goodvfork=false;

Due punti davanti e dietro possono esser usati insieme se avete bisogno di valori di parametri 'posizionali' senza i nomi. Notate che nel caso presentato successivamente, i parametri PERL_API vengono restituiti in ordine alfabetico.

    $ echo building_on `perl -V::osname: -V::PERL_API_.*:` now
    building_on 'linux' '5' '1' '9' now

-w
stampa degli avvertimenti riguardo costrutti dubbi, come nomi di variabili che sono menzionati solo una volta e variabili scalari che sono utilizzate prima di esser impostate, subroutine ridefinite, riferimenti a filehandle non definiti o filehandle aperti in modalità di sola lettura sui quali state cercando di scrivere, valori utilizzati come un numero che non sembra assomigliare ad un numero, utilizzare un array come fosse uno scalare, se le vostre subroutines hanno delle ricorsioni per più di 100 volte, e innumerevoli altre cose.

Questo switch abilita veramente soltanto la variabile interna $^W/ Potete disabilitare o promuovere degli avvertimenti specifici in degli errori fatali usando __WARN__, come descritto in perlvar e perlfunc/warn. Si veda anche perldiag e perltrap. Un nuovo strumento che permette di controllare piu' accuratamente gli avvertimenti è disponibile se volete manipolare classi intere di avvertimenti; vedete warnings o perllexwarn.

-W
Abilita tutti gli avvertimenti noncurante di no warnings o $^W. Si veda perllexwarn.

-X
Disabilita tutti gli avvertimenti noncurante di use warnings o $^W. Si veda perllexwarn.

-x
-x directory
dice a Perl che il programma è integrato in una più grande porzione di testo ASCII che non vi è correlata, come in un messaggio di posta elettronica. La spazzatura che viene prima verrà scartata fino alla prima linea che inizia con #! e contiene la stringa ``perl''. Qualsiasi switch sensato su quella linea verrà applicato. Se viene specificato un nome di directory, Perl passerà in quella directory prima di eseguire il programma. Lo switch -x deve esser terminato con un __END__ se c'è della spazzatura alla fine che deve essere ignorata (il programma può processare qualsiasi o tutta la spazzatura alla fine via DATA filehandle se lo desiderate).


VARIABILI D'AMBIENTE

HOME
Utilizzata se chdir non contiene argomenti.

LOGDIR
Utilizzata se chdir non contiene argomenti e HOME non è impostata.

PATH
Utilizzata nell'eseguire sotto-processi, e nel trovare il programma se viene utilizzato -S.

PERL5LIB
Una lista di directory nelle quali andare a cercare la i file della libreria Perl prima di cercare in quella standard e nella directory corrente. Qualunque directory specifica ad una particolare architettura che si trovi sotto la posizione specificata viene automaticamente inclusa se esiste. Se PERL5LIB non è definito, viene usato PERLLIB. Le directory sono separata (come in PATH) da dei due punti su piattaforma unix e da un punto e virgola in Windows (l'appropriato separatore di path che viene fornito dal comando perl -V:path_sep).

Quando fate girare il programma con i avvertimenti taint-checks (sia perché il programma stava girando con setuid o setgid, o lo switch -T era usato), nessuna variabile viene utilizzata. Il programma invece dovrebbe dire:

    use lib "/mia/directory";

PERL5OPT
Opzioni da riga di comando (switch). Gli switch in questa variabile sono presi come se fossero in ogni linea di comando Perl. Sono permessi solo gli switch -[DIMUdmtw]. Quando viene eseguito con i controlli per i dati potenzialmente pericolosi abilitati (perché il programma stava girando con setuid o setgid, oppure era utilizzato lo switch -T), questa variabile è ignorata. Se PERL5OPT inizia con -T, il controllo per i dati potenzialmente pericolosi varrà abilitato, e qualsiasi opzione seguente ignorata.

PERLIO
Una lista di strati PerlIO separata da spazi (o da due punti). Se perl è compilato per utilizzare il sistema PerlIO per l'IO (di default) questi strati hanno effetto sull'IO di perl.

È convenzione far iniziare i nomi degli strati con i due punti, per esempio :perlio, per enfatizzare la loro somiglianza alle variabili ``attributo''. Ma il codice che esegue il parsing delle stringhe che specificano lo strato (che è anche utilizzato per decodificare la variabile d'ambiente PERLIO) tratta i due punti come un separatore.

Un PERLIO non impostato o vuoto è equivalente a :stdio.

La lista diventa il default per tutti gli IO di perl. Conseguentemente, solo gli strati built-in possono apparire in questa lista, come strati esterni (come :encoding()) hanno bisogno di IO per poterli caricare! Si veda ``la direttiva open'' sul come aggiungere degli encoding esterni come default.

Gli strati che ha senso includere nella variabile d'ambiente PERLIO sono brevemente riassunti sotto. Per maggiori dettagli si veda PerlIO.

:bytes
Uno pseudostrato che spegne il flag :utf8 per lo strato sottostante. Improbabile che sia utile da solo, nella variabile d'ambiente globale PERLIO. Forse starete pensando a :crlf:bytes o :perlio:bytes.

:crlf
Uno strato che fa CRLF per la traduzione di ``\n'', distinguendo file di ``testo'' da file ``binari'' alla MS-DOS e sistemi operativi simili. (Attualmente non imita MS-DOS nel modo in cui tratta Control-Z come marcatore di fine file).

:mmap
Uno strato che implementa le operazioni di ``lettura'' su file utilizzando mmap() per far sì che un file (completo) appaia nello spazio di indirizzamento del processo, e quindi lo utilizzi come ``buffer'' di PerlIO.

:perlio
Questa è una re-implementazione del sistema di buffering a-la ``stdio'', scritto come ``strato'' PerlIO. Per le sue operazioni chiamerà qualsiasi tipo di strato sottostante (tipicamente :unix).

:pop
Uno pseudostrato sperimentale che rimuove lo strato che si trova in cima a tutti. Utilizzatelo con la stessa cura che avreste utilizzando la nitroglicerina.

:raw
Uno pseudostrato che manipola altri strati. Applicare lo strato :raw è equivalente a chiamare binmode($fh). Fa in modo che lo stream passi ciascun byte così com'è senza alcuna traslazione. In particolare, sono disabilitate le traslazioni CRLF, e/o :utf8 intuite dal locale.

Non come nella precedenti versioni di Perl, :raw non è solamente l'inverso di :crlf - altri strati che influirebbero la natura binaria dello stream sono rimossi o disabilitati.

:stdio
Questo strato fornisce un'interfaccia PerlIO facendo un wrapping [sorta di confezione che fornisce astrazione per livelli superiori, N.d.T.] a chiamate di libreria ANSI C ``stdio''. Questo strato fornisce sia buffering che IO. Notate che lo strato :stdio non esegue la traslazione CRLF anche se quello è il comportamento normale su quella piattaforma. Avrete bisogno del strato :crlf soprastante, per farlo.

:unix
strato di basso livello che chiama read, write e lseek ecc.

:utf8
Uno pseudostrato che abilita un flag (bandiera, N.d.T.) sullo strato sottostante, comunicando a perl che l'output dovrebbe essere in utf8 e che l'input dovrebbe esser considerato già come in formato utf8. Potrebbe esser utile con variabili d'ambiente PERLIO rendendo UTF-8 la scelta di default. (Per disabilitare quel comportamento utilizzate lo strato :bytes).

:win32
Su piattaforme Win32 native, questo strato sperimentale utilizza un ``handle'' di IO nativo anziché un descrittore di file numerico a-la unix. È risaputo avere diversi bug in questa versione.

Su tutte le piattaforme, l'insieme di strati impostato di default dovrebbe fornire risultati accettabili.

Per piattaforme UNIX sarà l'equivalente di ``unix perlio'' o ``stdio''. ``Configure'' è impostato per preferire l'implementazione ``stdio'' se la libreria di sistema fornisce accesso rapido al buffer, altrimenti usa l'implementazione ``unix perlio''.

Su Win32 il default per questa release è ``unix crlf''. Lo ``stdio'' di Win32 ha un numero di bug/caratteristiche mancanti per perl IO che sono in qualche modo dipendenti dalla versione/venditore del compilatore C. Utilizzare il nostro strato crlf come buffer evita questi problemi e rende le cose più uniformi. Lo strato crlf fornisce conversione da/a CRLF così come il buffering.

Questa versione utilizza unix come strato di più basso livello per Win32 e così via, e quindi utilizza ancora le routine a descrittore di file numerico del compilatore C. C'è uno strato nativo Win32 sperimentale che ci si aspetta venga migliorato e dovrebbe eventualmente divenire quello di default in Win32.

PERLIO_DEBUG
Se impostato al nome di un file o di un device allora di certe operazioni del sotto-sistema PerlIO verrè effettuato il log in quel file (aperto in modalità append). Tipici utlizzi sono, in UNIX:
   PERLIO_DEBUG=/dev/tty perl script ...

e approssimativamente l'equivalente Win32:

   set PERLIO_DEBUG=CON
   perl script ...

Questa funzionalità è disabilitata per script che sono eseguiti con setuid e per script che utilizzano lo switch -T.

PERLLIB
Una lista di directory nelle quali andare a cercare i file della libreria Perl prima di andare a cercare nella libreria standard e nella directory corrente. Se PERL5LIB è definito, PERLLIB non è utilizzato.

PERL5DB
Comando utilizzato per caricare codice del debugger. Il default è:
        BEGIN { require 'perl5db.pl' }

PERL5DB_THREADED
Se impostato ad un valore vero, indica al debugger che il codice di cui si sta facendo il debug, utilizza i thread.

PERL5SHELL (specifico della versione Win32)
Potrebbe esser impostato ad una shell alternativa che perl deve utilizzare internamente per eseguire i comandi con backtick [`, N.d.T.] o system(). Il default è cmd.exe /x/d/c in WindowsNT e command.com /c in Windows95. Il valore è considerato essere separato da spazio. Precede qualsiasi carattere che ha bisogno di esser protetto (come uno spazio o un backslash [\, N.d.T.]) con un backslash.

Va notato che Perl non utilizza COMSPEC per questo compito dato che COMSPEC ha un elevato grado di variabilità tra gli utenti, il che porta a problemi di portabilità. Inoltre, perl può utilizzare una shell che potrebbe non esser adeguata per un utilizzo interattivo, ed impostare COMSPEC a questa shell potrebbe interferire con il funzionamento corretto di altri programmi (i quali solitamente vanno a guardare in COMSPEC per trovare una shell che sia adatta ad un utilizzo interattivo).

PERL_ALLOW_NON_IFS_LSP (specifico della versione Win32)
Impostatelo ad 1 per permettere l'utilizzo di LSP non compatibili con IFS. Perl di solito va alla ricerca di un LSP non compatibile con IFS perché questo viene richiesto per la sua emulazione dei socket Windows come filehandle reali. Comunque, questo potrebbe causare dei problemi se state utilizzando un firewall come McAfee Guardian il quale richiede che tutte le applicazioni utilizzino il suo LSP che non è compatibile IFS, perché chiaramente Perl di norma eviterà di utilizzare tale LSP. Impostare questa variabile d'ambiente ad 1 significa che Perl semplicemente utilizzerà il primo LSP appropriato, elencato nel catalogo, il che rende felice McAfee Guardian (e nel caso particolare anche Perl continua a funzionare perché l'LSP di McAfee Guardian fa veramente altri giochetti che permettono di funzionare alle applicazioni che richiedono compatibilià IFS).

PERL_DEBUG_MSTATS
Rilevanete solamente se perl é compilato con ``malloc'' incluso nella distribuzione perl (cioé, se perl -V:d_mymalloc è 'define'). Se impostato, questo fa in modo che le statistiche sulla memoria vengano salvate dopo l'esecuzione del programma. Se impostato ad un valore intero maggiore di uno, fa anche in modo che le statistiche sulla memoria vengano salvate dopo la compilazione del programma.

PERL_DESTRUCT_LEVEL
Rilevante solamente se il vostro eseguibile perl era stato e compilato con -DDEBUGGING, questo controlla il comportamento della distruzione globale di oggetti e altri riferimenti. Si veda perlhack/PERL_DESTRUCT_LEVEL per maggiori informazioni.

PERL_DL_NONLAZY
Impostatelo ad uno per fare in modo che perl risolva tutti i simboli non definiti quando carica una libreria dinamica. Il comportamento di default è quello di risolvere i simboli quando sono usati. Impostare questa variabile è utile durante la fase di test delle estensioni, dato che vi assicura di ottenere un errore sul nome di una funzione scritto male anche se la suite di test che state utilizzando non la chiama esplicitamente.

PERL_ENCODING
Se state utilizzando la direttiva encoding senza un nome di encoding esplicito, per trovarne uno viene consultata la variabile d'ambiente PERL_ENCODING.

PERL_HASH_SEED
(A partire dal Perl 5.8.1). Utilizzato per rendere aleatoria la funzione interna di hashing di Perl. Per emulare il comportamento pre-5.8.1, impostatelo ad un intero (zero significa esattamente lo stesso ordine del 5.8.0). ``Pre-5.8.1'' significa, tra le altre cose, che le chiavi dell'hash saranno ordinate allo stesso modo tra differenti esecuzioni di Perl.

Il comportamento di default è quello di essere aleatorio a meno che non sia impostata PERL_HASH_SEED. Se Perl è stato compilato con -DUSE_HASH_SEED_EXPLICIT, il comportamento di default non è quello di essere aleatorio, a meno che non sia impostato PERL_HASH_SEED.

Se PERL_HASH_SEED non è impostato o è impostato ad una stringa non-numerica, Perl utilizza un seme pseudocasuale fornito dal sistema operativo e dalle librerie. Questo significa che ciascuna differente esecuzione di Perl avrà un tipo di ordinamento differente dei risultati di keys(), values(), e each().

Per favore fate caso che ciascun seme di hash è un'informazione sensibile. Gli hash vengono resi aleatori per proteggersi contro attacchi locali e remoti contro il codice Perl. Impostando manualmente un seme si potrebbe fare in modo che questa protezione sia parzialmente o completamente persa.

Si veda perlsec/``Algorithmic Complexity Attacks'' [``Attacchi basati sulla complessità degli algoritmi'', NdT] e PERL_HASH_SEED_DEBUG per maggiori informazioni.

PERL_HASH_SEED_DEBUG
(A partire dal Perl 5.8.1). Impostatelo ad uno per mostrare (su STDERR) il valore del seme dell'hash all'inizio dell'esecuzione. Questo, combinato con PERL_HASH_SEED è inteso per dare una mano in fase di debugging dei comportamenti non-deterministici causati dall'aver reso aleatorio l'hash.

Va notato che ciascun seme di hash è un'informazione sensibile: conoscendolo, una persona potrebbe pensare di architettare un attacco denial-of-service contro codice Perl, anche da remoto, si veda perlsec/``Algorithmic Complexity Attacks'' [``Attacchi basati sulla complessità degli algoritmi'', NdT] per maggiori informazioni. Non svelate il seme dell'hash a persone che non hanno bisogno di conoscerlo. Si veda anche hash_seed() di the Hash::Util manpage.

PERL_ROOT (specifico della versione VMS)
Un path logico assoluto nascosto dalla traduzione che contiene perl ed il dispositivo logico per il percorso @INC solo su VMS. Altri nomi logici che influiscono perl su VMS includono PERLSHR, PERL_ENV_TABLES, e SYS$TIMEZONE_DIFFERENTIAL ma sono opzionali e discussi maggiormente in perlvms e in README.vms nella distribuzione sorgente di Perl.

PERL_SIGNALS
Nelle versioni di Perl 5.8.1 e successive. Se impostato a unsafe il comportamento dei segnali pre-Perl-5.8.0 (immediato ma insicuro) viene reimpostato. Se impostato a safe, vengono utilizzati i segnali sicuri (o differiti). Si veda perlipc/``Segnali Differiti (Segnali Sicuri)''.

PERL_UNICODE
Equivalente allo switch -C da linea di comando. Notate che questo non è una variabile booleana-- impostare questo a "1" non è il modo giusto per ``abilitare Unicode'' (o alternativamente de-impostate PERL_UNICODE nella vostra shell prima di avviare Perl). Per ulteriori informazioni si veda la descrizione dello switch -C .

SYS$LOGIN (specifico della versione VMS)
Utilizzato se chdir non ha argomenti e HOME e LOGDIR non sono impostati.

Perl ha anche delle variabili d'ambiente che controllano come Perl gestisca dati, specifici di particolari linguaggi naturali. Si veda perllocale.

A parte queste cose, Perl non usa altre variabili d'ambiente, eccetto per renderle disponibili al programma che si sta eseguendo, e per creare un processo figlio. Comunque, programmi che girano con setuid impostato farebbero bene ad eseguire le seguenti linee prima di fare qualsiasi altra cosa, giusto per far restare le persone oneste:

    $ENV{PATH}  = '/bin:/usr/bin';    # o qualsiasi cosa abbiate bisogno
    $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
    delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};


TRADUZIONE

Versione

La versione su cui si basa questa traduzione è ottenibile con:

   perl -MPOD2::IT -e print_pod perlrun

Per maggiori informazioni sul progetto di traduzione in italiano si veda http://pod2it.sourceforge.net/ .

Traduttore

Traduzione a cura di Daniele Ludovici.

Revisore

Revisione a cura di dree.


Wed Jan 28 14:17:56 2009