2010-10-11 22 views
11

Ho il seguente script:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $count = 0; 
my (@first , @second , @third); 

while ($count <= 7){ 

    push (@first , $count); 
    push (@second , $count) if defined $count; 
    push (@third , $count) if $count; 
    $count++; 

} 

print "first: @first\n"; 
print "second: @second\n"; 
print "third: @third\n"; 

Questo produce il seguente output:

first: 0 1 2 3 4 5 6 7 
second: 0 1 2 3 4 5 6 7 
third: 1 2 3 4 5 6 7 

Qual è la differenza tra mettere if defined $count vs if $count, oltre il secondo metodo non aggiungerà lo zero a l'array? Ho cercato i perldocs ma non ho trovato la risposta.

risposta

25

Truth and Falsehood in perlsyn spiega quali valori sono considerati falso in un contesto booleano:

Il numero 0, le stringhe '0' e '', la lista vuota () e undef sono tutto falso in un contesto booleano. Tutti gli altri valori sono veri.

undef è il valore di una variabile che non è mai stato inizializzato (o che è stata ripristinata utilizzando il undef function). defined function restituisce true se il valore dell'espressione non è undef.

if $count è falso se $count è il numero 0, la stringa '0', la stringa vuota, undef, o un oggetto che è stato overloaded per tornare una di quelle cose quando utilizzato in un contesto booleano. Altrimenti, è vero. (L'elenco vuoto non può essere memorizzato in una variabile scalare.)

if defined $count è falso solo se $count è undef.

-1

Il modo in cui l'ho letto.

if $count è vero solo quando $count valuta != 0, quindi il terzo array non ha 0 in esso.

if defined $count controlla se lo $count è stato creato come scalare e come lo è lo scalare $count, è lo stesso del primo.

+3

deve essere: "quando $ count valuta! = 0" –

+0

@nathan. Saluti –

+0

Entrambi funzionano allo stesso modo, in realtà. È il valore che mettono alla prova che è diverso. Il primo verifica il valore di $ count, il secondo il valore di $ count definito. se() non importa come si ottiene il valore. –

2

I test dei predicati defined per verificare se la variabile ($count in questo caso) è stata definita. Nel codice che hai scritto, verrà sempre definito all'interno del ciclo perché ha sempre un certo valore.

Se si dovesse aggiungere:

undef $count; 
push (@first , 'undef'); 
push (@second , 'undef') if defined $count; 
push (@third , 'undef') if $count; 

dopo il ciclo, si vede la differenza. (Si noti che ho cambiato il codice per aggiungere letterale 'undef' invece di $count perché otterrete effetti fuorvianti di aggiungere il valore effettivo undef.

+0

Potrebbe essere un po 'più corretto dire che defined() restituisce true o false e che if() verifica quel valore. Il defined() fa la stessa cosa con o senza il condizionale. –

5

se si vede la documentazione di defined in perldoc allora vi accorgerete che

  • restituisce un valore booleano dice se ESPR ha un valore diverso rispetto al undef valore indefinito. Se ESPR non è presente, $ _ è controllato.

  • Un semplice Il test booleano non è distinguere tra undef, zero, la stringa vuota e "0", che sono tutti ugualmente falsi.

che significa,

push (@second , 'undef') if defined $count; 

quando $count = 0, allora è definito perché 0 è diverso da undef e definito restituisce vero, ma in questo caso push (@third , 'undef') if $count;if condition fallisce, è per questo che non è spingendo 0 nell'array.

3

La if decide di eseguire il suo blocco (o dichiarazione singola) guardando il valore dell'espressione si dà:

if(EXPR) { ... } 

Se l'espressione è vera, esegue il suo blocco. Se quell'espressione è falsa, non è così.

Questa espressione può essere qualsiasi cosa. Perl valuta l'espressione, riducendola a un valore che è vero o falso. Lo if() quindi osserva quel valore.

Quindi, rimuovendo quella parte della tua domanda, sei rimasto con "Qual è la differenza tra defined $count e $count". Bene, uno è il valore restituito per defined e l'altro è qualsiasi valore memorizzato in $count.

Quando si vuole capire che cosa fa un particolare bit di codice, ridurlo nello stesso processo logico che sarebbe perl, un passo alla volta. Guarda cosa fa ogni passo e sarai spesso in grado di rispondere alle tue domande. :)

Si dice di aver cercato la documentazione, ma non sono sicuro di dove si guardasse. Se si desidera cercare una funzione built-in, è possibile utilizzare l'interruttore di -f perldoc:

$ perldoc -f defined 

Se si desidera leggere sulla sintassi di Perl per cose come if, che è in perlsyn.

Ho una guida per principianti ai documenti Perl in Perl documentation documentation.

0

Come qualsiasi valore di stringa, "Il numero 0, le stringhe '0' e '', la lista vuota() e undef" non devono essere uguali a false perché non sono di natura booleana. Scrivere un codice che si basa su questa perversione, pur essendo tecnicamente corretto, è fuorviante e dovrebbe essere fortemente scoraggiato. Come dovrebbero le erbacce e le femminucce.

Problemi correlati