Apparentemente use strict
dovrebbe (deve) essere usato quando si vuole forzare perl a codificare correttamente, cosa che potrebbe forzare la dichiarazione, essere esplicita su stringhe e sottotitoli, cioè bareword o usare refs con cautela. Nota: se ci sono errori, use strict interromperà l'esecuzione se utilizzato.
Anche se use warnings;
ti aiuterà a trovare errori di battitura nel programma come se avessi perso un punto e virgola, hai usato "elseif" e non "elsif", stai usando una sintassi o una funzione deprecata, qualunque cosa del genere. Nota: l'uso degli avvisi fornirà solo avvisi e continuerà l'esecuzione, ovvero non interromperà l'esecuzione.
Comunque, sarebbe meglio se entrassimo nei dettagli, che sto specificando di seguito
Da perl.com (il mio preferito):
utilizzare "vars" rigorosi;
il che significa che devi sempre dichiarare le variabili prima di usarle.
Se non dichiari, probabilmente riceverai un messaggio di errore per la variabile non dichiarata
Il simbolo globale "$ variablename" richiede un nome di pacchetto esplicito in nomescript.pl riga 3
Questo avviso significa che Perl non è esattamente chiaro su quale sia l'ambito della variabile. Quindi devi essere esplicito riguardo alle tue variabili, il che significa dichiararle conmy
modo che siano limitate al blocco corrente, o fare riferimento ad esse con il loro nome completo (ad esempio: $ MAIN :: variablename).
Pertanto, viene attivato un errore in fase di compilazione se si tenta di accedere a una variabile che non ha soddisfatto almeno uno dei seguenti criteri:
Predefinito da Perl stesso, come @ARGV,% ENV e tutte le variabili di punteggiatura globali come $. o $ _.
Dichiarato con our (per un globale) o mio (per un lessicale).
Importato da un altro pacchetto. (L'uso vars pragma falsifica un'importazione, ma usa il nostro invece.)
Completamente qualificato utilizzando il nome del pacchetto e il separatore di pacchetto con due punti.
utilizzare "sottotitoli" rigorosi;
Considera due programmi
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
In entrambi i casi abbiamo un sub test_value () e vogliamo mettere il suo risultato in $ a. Eppure, quando eseguiamo i due programmi, otteniamo due risultati diversi:
Nel primo programma, al punto in cui arriviamo $a = test_value;
, Perl non conosce alcun sub test_value (), e test_value è interpretato come stringa "test_value". Nel secondo programma, la definizione di test_value () viene prima della $a = test_value;
riga. Perl pensa che test_value sia una chiamata secondaria.
Il termine tecnico per parole isolate come test_value che potrebbero essere sottotitoli e potrebbero essere stringhe a seconda del contesto, tra l'altro, è bareword . La gestione delle bareword da parte di Perl può creare confusione e può causare bug nel programma.
Il bug è quello che abbiamo incontrato nel nostro primo programma, ricordate che Perl non aspetterà di trovarlo test_value()
, quindi poiché non ha già visto test_value (), presume che vogliate una stringa. Quindi, se tu use strict subs;
, causerà la morte di questo programma con un errore:
Bareword "test_value" non è consentito mentre "strict subs" è in uso in ./a6-strictsubs.pl riga 3.
La soluzione a questo errore sarebbe
1. Usa le parentesi per chiarire che stai chiamando un sub. Se Perl vede $ a = test_value () ;,
2. Dichiara il tuo sub prima di usarlo per la prima volta
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. E se intendi usarlo come una stringa, citalo.
Quindi, questa limitazione fa sì che Perl tratti tutte le bareword come errori di sintassi. * Una parola nuda nuda è qualsiasi nome o identificatore semplice che non ha altre interpretazioni forzate dal contesto. (Il contesto è spesso forzato da una parola chiave o da un token nelle vicinanze, o dalla predichiarazione della parola in questione.) * Quindi se intendi usarlo come una stringa, citalo e se intendi usarlo come chiamata di funzione, dichiaralo in anticipo o usa le parentesi.
Le parole nude sono pericolose a causa di questo comportamento imprevedibile. use strict; (or use strict 'subs';)
li rende prevedibili, perché le parole semplici che potrebbero causare strani comportamenti in futuro faranno morire il tuo programma prima che possano provocare il caos
C'è un posto in cui è OK usare bareword anche quando hai attivato sottotitoli rigorosi: quando assegni le chiavi hash.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Le parole nude nelle chiavi hash vengono sempre interpretate come stringhe, quindi non c'è ambiguità.
usa "refs" rigorosi;
Ciò genera un errore di runtime se si utilizzano riferimenti simbolici, intenzionalmente o in altro modo. Un valore che non è un riferimento reale viene quindi trattato come un riferimento simbolico . Cioè, il riferimento viene interpretato come una stringa che rappresenta il nome di una variabile globale.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
utilizzare avvertenze;
Questo pragma con ambito lessicale consente un controllo flessibile sugli avvertimenti incorporati di Perl, sia quelli emessi dal compilatore che quelli dal sistema run-time.
Da perldiag
:
Quindi la maggior parte dei messaggi di avviso dalle classificazioni seguenti, ad esempio W, D e S, possono essere controllati utilizzando il warnings
pragma.
(W) Un avviso (opzionale)
(D) Un deprecazione (abilitato per impostazione predefinita)
(S) Un avviso grave (abilitato per impostazione predefinita)
Ho elencato alcuni dei messaggi di avviso che spesso si verificano di seguito in base alle classificazioni. Per informazioni dettagliate su di essi e altri messaggi fare riferimento a perldiag
(W) Un avvertimento (opzionale):
Argomento mancante in% s
Argomento mancante su -% c
(Intendevi invece &% s?)
(Intendevi "locale" invece di "nostro"?)
(Intendevi $ o @ invece di%?)
'% S 'non è una
lunghezza di riferimento del codice () usata su% s
Misplaced _ in number
(D) Una deprecazione (abilitata per impostazione predefinita):
definito (@array) è deprecato
definito (% hash) è deprecato L'
uso deprecato di my () in condizioni false
$ # non è più supportato
(S) Un avviso grave (abilitato per impostazione predefinita)
elseif dovrebbe essere elsif
% s trovato dove l'operatore previsto
(Operatore mancante prima di% s?)
(Punto e virgola mancante sulla riga precedente?)
% s mai introdotto
Operatore o punto e virgola mancante prima di% s
Problema di precedenza: open% s dovrebbe essere aperto (% s)
Mancata corrispondenza del prototipo:% s vs% s
Avviso: l'uso di "% s" senza parentesi è ambiguo
Impossibile aprire% s:% s
use loose;