Perché definito sdf restituisce true in questo esempio Perl?
Domanda
Ho provato questo esempio in Perl. Qualcuno può spiegare perché è vero?
if (defined sdf) { print "true"; }
Stampa true
.
sdf potrebbe essere qualsiasi nome.
Inoltre, se è stata definita la funzione sdf e restituisce 0, non stampa nulla.
print (sdf);
non stampa la stringa sdf ma
if (sdf eq "sdf")
{
print "true";
}
stampa vero.
La domanda correlata rimane se sdf è una stringa. Cosa non viene stampato dalla stampa?
Soluzione
sdf
è un bareword .
perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1. Execution of -e aborted due to compilation errors.
Per più divertimento, prova
perl -Mstrict -e "print sdf => qq{\n}"
Vedi A rigor di termini sull'uso rigoroso :
L'aspetto sottomarino dell'uso rigoroso disabilita l'interpretazione delle `` parole nude '' come stringhe di testo. Per impostazione predefinita, un identificatore Perl (una sequenza di lettere, cifre e caratteri di sottolineatura, che non inizia con una cifra a meno che non sia completamente numerico) che non sia altrimenti una parola chiave incorporata o una definizione di subroutine vista in precedenza viene trattato come una stringa di testo tra virgolette:
@daynames = (sun, mon, tue, wed, thu, fri, sat);
Tuttavia, questa è considerata una pratica pericolosa, perché potrebbero derivarne bug oscuri:
@monthnames = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);
Riesci a individuare il bug? Sì, la decima voce non è la stringa 'oct', ma piuttosto un'invocazione della funzione
oct ()
incorporata, che restituisce l'equivalente numerico del$ _
predefinito trattato come un numero ottale.
Corretto: (grazie @ysth)
E:\Home> perl -we "print sdf" Unquoted string "sdf" may clash with future reserved word at -e line 1. Name "main::sdf" used only once: possible typo at -e line 1. print() on unopened filehandle sdf at -e line 1.
Se viene fornito un bareword per print
nello slot degli oggetti indiretti, viene utilizzato come filehandle su cui stampare. Poiché non vengono forniti altri argomenti, print
si imposta per impostazione predefinita sulla stampa di $ _
su filehandle sdf
. Poiché sdf
non è stato aperto, non riesce. Se lo esegui senza avvisi, non viene visualizzato alcun output. Nota anche:
E:\Home> perl -MO=Deparse -e "print sdf" print sdf
sdf
è un bareword .perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1. Execution of -e aborted due to compilation errors.Per più divertimento, prova
perl -Mstrict -e "print sdf => qq{\n}"
Vedi A rigor di termini sull'uso rigoroso :
L'aspetto sottomarino dell'uso rigoroso disabilita l'interpretazione delle `` parole nude '' come stringhe di testo. Per impostazione predefinita, un identificatore Perl (una sequenza di lettere, cifre e caratteri di sottolineatura, che non inizia con una cifra a meno che non sia completamente numerico) che non sia altrimenti una parola chiave incorporata o una definizione di subroutine vista in precedenza viene trattato come una stringa di testo tra virgolette:
@daynames = (sun, mon, tue, wed, thu, fri, sat);
Tuttavia, questa è considerata una pratica pericolosa, perché potrebbero derivarne bug oscuri:
@monthnames = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);
Riesci a individuare il bug? Sì, la decima voce non è la stringa 'oct', ma piuttosto un'invocazione della funzione
oct ()
incorporata, che restituisce l'equivalente numerico del$ _
predefinito trattato come un numero ottale.Corretto: (grazie @ysth)
E:\Home> perl -we "print sdf" Unquoted string "sdf" may clash with future reserved word at -e line 1. Name "main::sdf" used only once: possible typo at -e line 1. print() on unopened filehandle sdf at -e line 1.Se viene fornito un bareword per
$ _
su filehandlesdf
. Poichésdf
non è stato aperto, non riesce. Se lo esegui senza avvisi, non viene visualizzato alcun output. Nota anche:E:\Home> perl -e "print asdfg, sadjkfsh" No comma allowed after filehandle at -e line 1.come conferma di questa osservazione. Nota anche:
E:\Home> perl -e "print asdfg => sadjkfsh" asdfgsadjkfsh<*>Quest'ultimo stampa entrambe le stringhe perché
= >
cita automaticamente le stringhe su LHS se sono costituite esclusivamente da caratteri 'word', rimuovendo l'interpretazione del filehandle del primo argomento.Tutti questi esempi mostrano che l'uso di parole chiave porta a molte sorprese. Dovresti
;usare rigoroso
per evitare tali casi.
come conferma di questa osservazione. Nota anche:
<*> <*> Quest'ultimo stampa entrambe le stringhe perché = >
cita automaticamente le stringhe su LHS se sono costituite esclusivamente da caratteri 'word', rimuovendo l'interpretazione del filehandle del primo argomento.
Tutti questi esempi mostrano che l'uso di parole chiave porta a molte sorprese. Dovresti usare rigoroso
per evitare tali casi.
Altri suggerimenti
Questo è un " bareword " ;. Se consentito, ha il valore di " sdf "
e non è pertanto definito.
L'esempio non è speciale:
telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
True
Nessuno di questi equivale a undef
che è ciò che definito
verifica.
Potresti voler leggere questo articolo sulla verità in Perl: Che cos'è la verità?
definito
restituisce vero se l'espressione ha un valore diverso da quello non definito.
la funzione definita restituisce true a meno che il valore passato nell'argomento non sia definito. Ciò è utile distinguendo una variabile contenente 0 o " " da una variabile che ha appena fatto l'occhiolino all'esistenza.