2010-10-11 4 views
11

Ich habe das folgende Skript:

#!/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"; 

Dies erzeugt die folgende Ausgabe:

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 

Was zwischen Putting if defined $count vs. if $count, andere als die letztere Methode ist der Unterschied wird die Null nicht hinzufügen das Array? Ich habe die Perldocs durchsucht, konnte aber keine Antwort finden.

Antwort

25

Truth and Falsehood in perlsyn erklärt, welche Werte falsch betrachtet werden in einem Booleschen Kontext:

Die Zahl 0, die Saiten '0' und '', die leere Liste () und undef sind alle falsch in einem Booleschen Kontext. Alle anderen Werte sind wahr.

undef ist der Wert einer Variablen, die niemals initialisiert wurde (oder dass zurückgesetzt wurde unter Verwendung der undef function). Der Wert defined function gibt true zurück, wenn der Wert des Ausdrucks nicht undef ist.

if $count ist falsch, wenn $count die Zahl 0, die Zeichenfolge '0', die leere Zeichenkette, undef oder ein Objekt, das overloaded gewesen ist eines dieser Dinge, zurückzukehren, wenn in einem Booleschen Kontext verwendet. Ansonsten ist es wahr. (Die leere Liste kann nicht in einer skalaren Variablen gespeichert werden.)

if defined $count ist nur falsch, wenn $countundef ist.

-1

Die Art, wie ich es gelesen habe.

if $count ist nur wahr, wenn $count wertet != 0 aus, daher das dritte Array hat keine 0 drin.

if defined $count überprüft, ob die $count als Skalar erstellt wurde, und wie Sie $count Skalar haben, ist es das gleiche wie das erste.

+3

sollte sein: "wenn $ count wertet! = 0" –

+0

@nathan. Prost –

+0

Sie arbeiten beide auf die gleiche Weise, eigentlich. Es ist der Wert, den sie testen, der anders ist. Der erste testet den Wert von $ count, der zweite den Wert von $ count. if() ist es egal, wie Sie den Wert erhalten. –

2

Das Prädikat defined prüft, ob die Variable ($count in diesem Fall) überhaupt definiert ist. In dem Code, den Sie geschrieben haben, wird er immer innerhalb der Schleife definiert, da er immer einen Wert hat.

Wenn Sie hinzufügen waren:

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

nach der Schleife, würden Sie den Unterschied sehen. (Beachten Sie, dass ich den Code geändert, um die wörtliche 'undef' statt $count hinzuzufügen, da Sie irreführende Effekte bekommen die tatsächliche undef Wert aus der Addition.

+0

Es ist vielleicht ein bisschen korrekter zu sagen, dass define() wahr oder falsch zurückgibt und dass der if() diesen Wert überprüft. Das Defined() macht dasselbe mit oder ohne Conditional. –

5

, wenn Sie in der Dokumentation von defined in perldoc sehen, dann werden Sie feststellen, dass

  • Gibt einen booleschen Wert zu sagen ob EXPR einen anderen Wert als der undefinierten Wert undef hat. Wenn EXPR nicht vorhanden ist, $ _ ist geprüft.

  • Eine einfache Boolesche Test wird nicht unterscheiden zwischen undef, Null, die leere Zeichenfolge, und "0", die alle gleichermaßen falsch sind.

das heißt,

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

wenn $count = 0, dann wird definiert, weil 0 verschieden von undef und gibt true zurück, definiert, aber in diesem Fall push (@third , 'undef') if $count;if condition versagt, deshalb ist es nicht Drücken 0 in das Array.

3

Der if entscheidet seinen Block (oder einzelne Anweisung) durch einen Blick auf den Wert des Ausdrucks geben Sie es zu laufen:

if(EXPR) { ... } 

Wenn dieser Ausdruck wahr ist, es seinen Block läuft. Wenn dieser Ausdruck falsch ist, tut es das nicht.

Dieser Ausdruck kann fast alles sein. Perl wertet den Ausdruck aus und reduziert ihn auf einen Wert, der entweder wahr oder falsch ist. Die if() schaut dann auf diesen Wert.

Wenn Sie also diesen Teil Ihrer Frage entfernen, bleibt Ihnen "Was ist der Unterschied zwischen defined $count und $count". Nun, einer ist der Rückgabewert für defined und der andere ist welcher Wert in $count gespeichert ist.

Wenn Sie herausfinden wollen, was ein bestimmtes Stück Code tut, verringert sie in dem gleichen logischen Prozess, perl würde, ein Schritt zu einer Zeit. Sehen Sie, was jeder Schritt macht, und Sie werden oft in der Lage sein, Ihre eigenen Fragen zu beantworten. :)

Sie sagen, dass Sie die Dokumentation durchsucht haben, aber ich bin mir nicht sicher, wo Sie gesucht haben. Wenn Sie eine integrierte Funktion nachschlagen möchten, können Sie perldoc des -f Schalter verwenden:

$ perldoc -f defined 

Wenn Sie für Dinge wie if über Perl-Syntax lesen möchten, dass in perlsyn ist.

Ich habe ein Anfängerhandbuch für die Perl-Dokumente in Perl documentation documentation.

0

Wie alle Fule kno, "Die Zahl 0, die Strings '0' und '', die leere Liste() und undef" sollten nicht mit false gleichgesetzt werden, da sie keinen booleschen Charakter haben. Das Schreiben von Code, der sich auf diese Perversion stützt, ist zwar technisch korrekt, aber irreführend und es sollte dringend davon abgeraten werden. Wie sollten Unkraut und Weichlinge.

Verwandte Themen