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?

È stato utile?

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 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 -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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top