Cosa cambia, se del caso, sono tenuti a fare la seguente Perl prova di proiettile eval?
se ricordo bene, se vi preoccupate per il contenuto di $ @ (e non solo se sia vero o no) è inoltre necessario fare attenzione a $ @ sovrascrittura da altro codice che muore prima di guardare (vedi risposta alla 1. sotto).
- Ha il seguente stile proteggere contro $ @ non essere impostato correttamente?
Sì, $ @ può essere sovrascritto nel tempo tra la eval
e if
. Il caso più comune per questo, se non ricordo male, è il metodo DELETE di un oggetto che sta andando fuori ambito (perché era nell'eval) usando un successo eval
.
Cosa significa "1;" proteggere contro?
Il valore vero costante (non deve essere 1) è lì per garantire che il blocco eval
restituisca un valore vero. Se il codice nel blocco muore, il blocco restituisce una stringa vuota e viene eseguito il blocco do
.Se sei certo che l'ultima affermazione nel blocco sarà sempre vera, allora non è necessaria; tuttavia, non vi è alcun motivo per non essere solo sicuri del valore costante.
Il "o do {" è migliore del proverbio "if ($ @) {"? Se è così, perché?
Evita di dover memorizzare il valore di ritorno del blocco eval
. Si potrebbe dire
my $result = eval {
#do stuff
1;
};
unless ($result) {
# handle error
}
fonte
2013-05-23 12:11:11
Il modo più semplice per la gestione degli errori a prova di proiettile con un eval blocco è quello di utilizzare un modulo che implementa try-catch, come la sintassi, per esempio [Prova :: Piccolo] (https://metacpan.org/module/DOY/Try-Tiny-0.12/lib/Try/Tiny.pm). La documentazione elenca ulteriori avvertimenti a cui potresti essere interessato. – amon
Questo è chiaramente il risultato di qualcuno che applica la [raccomandazione di Perl :: Critico] (http://p3rl.org/Perl::Critic::Policy::ErrorHandling :: RequireCheckingReturnValueOfEval). – daxim
@daxim Che generalmente non è una cosa negativa :) – nslntmnx