fetchrow_arrayref Rückgabewert

Hallo,

in der Hilfe zu fetchrow_arrayref steht, dass wenn keine weiteren
Datensätze mehr vorhanden sind, der Rückgabewert undef ist. Wenn ich
nun in einer while-Schleife also etwas der folgenden Art schreibe:
while($Handle->fetchrow_arrayref) {
# mach was
}

dann müsste undef ja als false ausgewertet werden. Ist das korrekt?
Wird undef immer als false ausgewertet, oder muss ich um sicher zu sein
folgendes schreiben:
while($Handle->fetchrow_arrayref !=3D undef) {
# mach was
}

Grüsse und danke,
Anton
Anton Berg [ Do, 06 April 2006 19:06 ] [ ID #1263545 ]

Re: fetchrow_arrayref Rückgabewert

Anton Berg wrote:
> Hallo,
>
> in der Hilfe zu fetchrow_arrayref steht, dass wenn keine weiteren
> Datensätze mehr vorhanden sind, der Rückgabewert undef ist. Wenn ich
> nun in einer while-Schleife also etwas der folgenden Art schreibe:
> while($Handle->fetchrow_arrayref) {
> # mach was
> }
>
> dann müsste undef ja als false ausgewertet werden. Ist das korrekt?
> Wird undef immer als false ausgewertet, oder muss ich um sicher zu sein
> folgendes schreiben:
> while($Handle->fetchrow_arrayref != undef) {
> # mach was
> }

foreach my $value (1,0,undef){
print $value,"\t",$value?"true":"false","\n";
}


HTH,
Dominik
Dominik Seelow [ Do, 06 April 2006 19:38 ] [ ID #1263546 ]

Re: fetchrow_arrayref Rückgabewert

Anton Berg <antonberg1 [at] gmx.de> schrob:
> [...]
> dann müsste undef ja als false ausgewertet werden. Ist das korrekt?

Ja. undef, 0, "" und "0" sind false.

> Wird undef immer als false ausgewertet, oder muss ich um sicher zu sein
> folgendes schreiben:
> while($Handle->fetchrow_arrayref != undef) {

Das wäre falsch. != vergleicht Zahlen, also würde undef zu 0
konvertiert, was eine Warnung auslöst; und der Vergleich wäre für alle
Werte, deren Zahlenwert 0 ist, wahr. Probier mal

perl -wle 'print "$_: ", ($_ != undef) ? "!= undef" : "== undef" for 1, "hallo", [], undef'

HTH, Lukas
Lukas Mai [ Fr, 07 April 2006 08:32 ] [ ID #1265187 ]

Re: fetchrow_arrayref Rückgabewert

Anton Berg wrote:

> in der Hilfe zu fetchrow_arrayref steht, dass wenn keine weiteren
> Datensätze mehr vorhanden sind, der Rückgabewert undef ist.

Das ist nur die halbe Realität. Es kann auch ein Fehler
die Ursache sein. Darauf solltest Du prüfen, falls
Du keine Exceptions ("RaiseError") aktiviert hast.

> dann müsste undef ja als false ausgewertet werden. Ist das korrekt?

Wie meine Vorredner schon sagten: ja.
Mit dieser Frage hast Du Dich als clueless Newbie geoutet :)

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Fr, 07 April 2006 09:45 ] [ ID #1265189 ]

Re: fetchrow_arrayref Rückgabewert

Lukas Mai wrote:

> Das wäre falsch. != vergleicht Zahlen, also würde undef zu 0
> konvertiert, was eine Warnung auslöst; und der Vergleich wäre für alle
> Werte, deren Zahlenwert 0 ist, wahr. Probier mal
>
> perl -wle 'print "$_: ", ($_ != undef) ? "!= undef" : "== undef" for 1, "hallo", [], undef'

Ich bekomme:

Use of uninitialized value in numeric ne (!=) at -e line 1.
1: != undef
Use of uninitialized value in numeric ne (!=) at -e line 1.
Argument "hallo" isn't numeric in numeric ne (!=) at -e line 1.
hallo: == undef
Use of uninitialized value in numeric ne (!=) at -e line 1.
ARRAY(0x811a3c8): != undef
Use of uninitialized value in concatenation (.) or string at -e line 1.
Use of uninitialized value in numeric ne (!=) at -e line 1.
Use of uninitialized value in numeric ne (!=) at -e line 1.
: == undef

Was will uns der Autor mit diesem Resultat sagen?

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Fr, 07 April 2006 10:02 ] [ ID #1265190 ]

Re: fetchrow_arrayref Rückgabewert

Frank Seitz <devnull4711 [at] web.de> schrob:
> Lukas Mai wrote:
>
>> Das wäre falsch. != vergleicht Zahlen, also würde undef zu 0
>> konvertiert, was eine Warnung auslöst; und der Vergleich wäre für alle
>> Werte, deren Zahlenwert 0 ist, wahr. Probier mal
>>
>> perl -wle 'print "$_: ", ($_ != undef) ? "!= undef" : "== undef" for 1, "hallo", [], undef'
>
> Ich bekomme:
>
> Use of uninitialized value in numeric ne (!=) at -e line 1.
> 1: != undef

1 != undef (plus Warnung)

> Use of uninitialized value in numeric ne (!=) at -e line 1.
> Argument "hallo" isn't numeric in numeric ne (!=) at -e line 1.
> hallo: == undef

"hallo" == undef (plus zwei Warnungen)

> Use of uninitialized value in numeric ne (!=) at -e line 1.
> ARRAY(0x811a3c8): != undef

[] != undef (plus Warnung)

> Use of uninitialized value in concatenation (.) or string at -e line 1.
> Use of uninitialized value in numeric ne (!=) at -e line 1.
> Use of uninitialized value in numeric ne (!=) at -e line 1.
> : == undef

undef == undef (plus zwei Warnungen (Bonus-Warnung wegen "$_: "))

> Was will uns der Autor mit diesem Resultat sagen?

Dass == kein generischer Gleichheitstest ist, sondern für Zahlen gedacht
ist. Und obwohl undef == undef wahr ist, gilt das auch für "string" ==
undef. Das ist alles.

HTH, Lukas
Lukas Mai [ Sa, 08 April 2006 20:38 ] [ ID #1266187 ]

Re: fetchrow_arrayref Rückgabewert

Lukas Mai wrote:
> Frank Seitz <devnull4711 [at] web.de> schrob:
>>
>>Was will uns der Autor mit diesem Resultat sagen?
>
> Dass == kein generischer Gleichheitstest ist, sondern für Zahlen gedacht
> ist. Und obwohl undef == undef wahr ist, gilt das auch für "string" ==
> undef. Das ist alles.

Ich denke, alle Operatoren außer defined sind auf undef nicht anwendbar.
Streng genommen ist das Ergebnis undefiniert, aber Perl versucht
das Beste draus zu machen und liefert trotzdem ein
definiertes(?) Resultat. Die Warnungen zeigen, dass eine
Programmierung, die darauf aufbaut, aber eigentlich unerwünscht ist.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Sa, 08 April 2006 21:37 ] [ ID #1266188 ]

Re: fetchrow_arrayref Rückgabewert

Frank Seitz schrieb:

>
> Ich denke, alle Operatoren außer defined sind auf undef nicht anwendbar.
> Streng genommen ist das Ergebnis undefiniert, aber Perl versucht
> das Beste draus zu machen

Hallo,

undef ist doch ein gültiger bool:

perldoc perlsyn:
---The number 0, the strings '0' and '', the empty list (), and undef
are all false in a boolean context.---

Also sind mindestens die boolschen Operatoren anwendbar und das Ergebnis
ist wohldefiniert.

Christoph
--

perl -e "print scalar reverse q/ed.enilno [at] ergn.l.hc/"
Ch Lamprecht [ So, 09 April 2006 10:32 ] [ ID #1267009 ]

Re: fetchrow_arrayref Rückgabewert

Ch Lamprecht wrote:
> Frank Seitz schrieb:
>>
>>Ich denke, alle Operatoren außer defined sind auf undef nicht anwendbar.
>>Streng genommen ist das Ergebnis undefiniert, aber Perl versucht
>>das Beste draus zu machen
>
> undef ist doch ein gültiger bool:
>
> perldoc perlsyn:
> ---The number 0, the strings '0' and '', the empty list (), and undef
> are all false in a boolean context.---
>
> Also sind mindestens die boolschen Operatoren anwendbar und das Ergebnis
> ist wohldefiniert.

Stimmt. Ich hätte wohl besser schreiben sollen: "Alle
Vergleichsoperatoren sind ...".

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Mo, 10 April 2006 09:34 ] [ ID #1268454 ]
Perl » de.comp.lang.perl.misc » fetchrow_arrayref Rückgabewert

Vorheriges Thema: Aufruf von subroutinen
Nächstes Thema: [de.comp.lang.perl.misc] mini-FAQ <26/10/2004>