0e0 ist TRUE?
am 11.03.2006 10:33:07 von Torsten Mohr
Hallo,
nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
Muà ich '0e0' als String verwenden, damit es TRUE ist?
#! /usr/bin/perl -w
my $a = 0e0;
print "a <$a>\n";
if($a) {
print "TRUE\n";
}
else {
print "FALSE\n";
}
Danke für Tips,
Torsten.
Re: 0e0 ist TRUE?
am 11.03.2006 10:57:47 von Thomas Wittek
> nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
> Muà ich '0e0' als String verwenden, damit es TRUE ist?
>=20
> my $a =3D 0e0;
Was willst du denn mit 0e0 bezwecken? In Perl heiÃt das so viel wie:=
0 *
10^0 =3D 0 * 1 =3D 0. 1e3 ist z.B. =3D 1 * 10^3 =3D 1000.
Und der Wert 0 ist in Perl nunmal "false" (genau wie ein leerer String
in Perl "false" ist). Alles andere (Ausnahme: undef) ist "true".
-Thomas
Re: 0e0 ist TRUE?
am 11.03.2006 11:44:06 von Slaven Rezic
Torsten Mohr writes:
> Hallo,
>
> nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
> Muß ich '0e0' als String verwenden, damit es TRUE ist?
>
> #! /usr/bin/perl -w
>
> my $a = 0e0;
>
> print "a <$a>\n";
>
> if($a) {
> print "TRUE\n";
> }
> else {
> print "FALSE\n";
> }
>
>
0e0 ist das Gleiche wie 0.0.
my $a = 0e0;
my $b = 0.0;
use Devel::Peek; Dump $a; Dump $b;
__END__
SV = NV(0x813401c) at 0x811dca8
REFCNT = 1
FLAGS = (PADBUSY,PADMY,NOK,pNOK)
NV = 0
SV = NV(0x8134014) at 0x811dccc
REFCNT = 1
FLAGS = (PADBUSY,PADMY,NOK,pNOK)
NV = 0
--
Slaven Rezic - slaven rezic de
need xpm or ppm output from GD?
http://search.cpan.org/search?mode=module&query=GD::Convert
Re: 0e0 ist TRUE?
am 11.03.2006 12:23:16 von Christian Lackas
* Torsten Mohr [2006-03-11]:
Hallo Torsten,
> nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
> Muß ich '0e0' als String verwenden, damit es TRUE ist?
Ja. Genau wie '0.0' (und Konsorten), sowie das spezielle '0 but true'
gibt Perl dann keine Warnung aus, wenn man den Rückgabewert in einem
numerischen Kontext verwendet (man erhält dann 0), aber in einem
boolschen Kontext ist es trotzdem wahr.
Die *Zahl* 0 (ob als integer oder float ist egal) ist immer falsch
(genau wie der String '0'), aber der String '0E0' halt nicht. Dieser
wandelt sich aber in einem numerischen Kontext in die Zahl 0.
Gruß
Christian
--
Nichtstun ist besser als mit viel Mühe nichts schaffen. (Laotse)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: 0e0 ist TRUE?
am 11.03.2006 14:13:44 von Joachim Pense
Am 11 Mar 2006 11:44:06 +0100 schrieb Slaven Rezic:
> Torsten Mohr writes:
>
>> Hallo,
>>
>> nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
>> Muß ich '0e0' als String verwenden, damit es TRUE ist?
>>
>> #! /usr/bin/perl -w
>>
>> my $a = 0e0;
>>
>> print "a <$a>\n";
>>
>> if($a) {
>> print "TRUE\n";
>> }
>> else {
>> print "FALSE\n";
>> }
>>
>
> 0e0 ist das Gleiche wie 0.0.
>
Du musst aber aufpassen: wenn du Inputdaten 0e0 kriegst (z.B. von einem
File, oder einer Datenbank), dann werden die nicht 0e0, sondern der String
"0e0", und der ist dann true.
In diese Falle bin ich schon einige Male gefallen.
Joachim
Re: 0e0 ist TRUE?
am 11.03.2006 15:46:23 von Frank Seitz
Joachim Pense wrote:
> Am 11 Mar 2006 11:44:06 +0100 schrieb Slaven Rezic:
>>
>>0e0 ist das Gleiche wie 0.0.
>
> Du musst aber aufpassen: wenn du Inputdaten 0e0 kriegst (z.B. von einem
> File, oder einer Datenbank), dann werden die nicht 0e0, sondern der String
> "0e0", und der ist dann true.
Guter Hinweis, da kommt man nicht gleich drauf. Ich zumindest habe gestutzt.
So ist es aber definiert: Bei Strings sind nur '' und '0' falsch,
alle anderen (einschließlich '0e0', '0.0' '0.00' etc.) sind wahr.
Man muss wissen, dass Perl im boolschen Kontext einen
einen String nimmt, wie er ist und *nicht* versucht,
ihn in eine Zahl zu konvertieren.
> In diese Falle bin ich schon einige Male gefallen.
Dem kannst Du entgehen, indem Du eine 0 auf den Wert draufaddierst.
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
Re: 0e0 ist TRUE?
am 11.03.2006 16:05:49 von Joachim Pense
Am Sat, 11 Mar 2006 15:46:23 +0100 schrieb Frank Seitz:
> So ist es aber definiert: Bei Strings sind nur '' und '0' falsch,
> alle anderen (einschließlich '0e0', '0.0' '0.00' etc.) sind wahr.
> Man muss wissen, dass Perl im boolschen Kontext einen
> einen String nimmt, wie er ist und *nicht* versucht,
> ihn in eine Zahl zu konvertieren.
>
>> In diese Falle bin ich schon einige Male gefallen.
>
> Dem kannst Du entgehen, indem Du eine 0 auf den Wert draufaddierst.
>
Das hab ich dann auch immer gemacht - nach der Fehlersuche ...
Joachim
Re: 0e0 ist TRUE?
am 11.03.2006 16:10:47 von Frank Seitz
ralphl@xxx.uni-muenchen.de wrote:
> Nein, any ref will do it.
>
> perl -e '$a=\do{0e0}; print "Yo man\n" if($a);'
> aber
> perl -e '$a=\do{0e0}; print "Yo man\n" if($$a);'
Genausogut könntest Du vorschlagen, den Test wegzulassen.
> Geht natürlich auch als array,hash, file , sub refs.
> Camel 3 pp. 29 (What is truth),
> Any string is true
^^^^^^^^^^^^^^^^^^
> Any number is true except for 0 (was auch immer 0 bei floating oints
> ist),
> Any reference is true (s.o.)
> Any undefind value is false.
Mit Deinem Zitat stimmt was nicht.
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
Re: 0e0 ist TRUE?
am 11.03.2006 16:16:36 von unknown
On Sat, 11 Mar 2006 10:33:07 +0100, Torsten Mohr
wrote:
>Hallo,
>
>nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
>Muß ich '0e0' als String verwenden, damit es TRUE ist?
Nein, any ref will do it.
perl -e '$a=\do{0e0}; print "Yo man\n" if($a);'
aber
perl -e '$a=\do{0e0}; print "Yo man\n" if($$a);'
Geht natürlich auch als array,hash, file , sub refs.
Camel 3 pp. 29 (What is truth),
Any string is true
Any number is true except for 0 (was auch immer 0 bei floating oints
ist),
Any reference is true (s.o.)
Any undefind value is false.
Maw wenn Du das das oben verfalsen willstt, sag: undef $a
Gruss
Ralph
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= East/West-Coast Server Farms - Total Privacy via Encryption =---
Re: 0e0 ist TRUE?
am 11.03.2006 17:09:41 von unknown
On Sat, 11 Mar 2006 16:10:47 +0100, Frank Seitz
wrote:
>ralphl@xxx.uni-muenchen.de wrote:
>
>> Nein, any ref will do it.
>>
>> perl -e '$a=\do{0e0}; print "Yo man\n" if($a);'
>> aber
>> perl -e '$a=\do{0e0}; print "Yo man\n" if($$a);'
>
>Genausogut könntest Du vorschlagen, den Test wegzulassen.
Die Frage war
>>>Muß ich '0e0' als String verwenden, damit es TRUE ist?
War meine Antwort (nein, es geht auch anders) da nicht sachgerecht?
Mit dem oben angeführten Beispiel kann man mit einem einzigen Zeichen
mehr $$a vs. $a zwischen wahr und falsch für eine Zahlendarstellung
hin und herschalten. Warum sollte das mal nicht von Interesse sein?
Zumindestenst taugts zum obfuskieren 8-).
>> Geht natürlich auch als array,hash, file , sub refs.
>> Camel 3 pp. 29 (What is truth),
>> Any string is true
except for "" and "0" . Pardon, auch für die Tippstörung
und danke für den Hinweis auf eine notwendige Präzisierung.
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= East/West-Coast Server Farms - Total Privacy via Encryption =---
Re: 0e0 ist TRUE?
am 11.03.2006 17:25:07 von Frank Seitz
ralphl@xxx.uni-muenchen.de wrote:
> On Sat, 11 Mar 2006 16:10:47 +0100, Frank Seitz wrote:
>>ralphl@xxx.uni-muenchen.de wrote:
>>
>>>Nein, any ref will do it.
>>>
>>>perl -e '$a=\do{0e0}; print "Yo man\n" if($a);'
>>>aber
>>>perl -e '$a=\do{0e0}; print "Yo man\n" if($$a);'
>>
>>Genausogut könntest Du vorschlagen, den Test wegzulassen.
>
> Die Frage war
>
>>>>Muß ich '0e0' als String verwenden, damit es TRUE ist?
>
> War meine Antwort (nein, es geht auch anders) da nicht sachgerecht?
Sie war deshalb nicht sachgerecht, weil Dein erster Test mit dem
Wert garnichts mehr zu tun hat. Eine Referenz, wie Du
selbst zitiert hast, ist immer wahr. Der zweite Test ist nur
eine andere Formulierung für das Ursprüngliche.
> Mit dem oben angeführten Beispiel kann man mit einem einzigen Zeichen
> mehr $$a vs. $a zwischen wahr und falsch für eine Zahlendarstellung
> hin und herschalten.
Diese Sichtweise erhält von mir für ihre Abstrusität
einen Sonderpunkt verliehen :)
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
Re: 0e0 ist TRUE?
am 11.03.2006 18:24:50 von Frank Seitz
ralphl@xxx.uni-muenchen.de wrote:
>>
>>Diese Sichtweise erhält von mir für ihre Abstrusität
>>einen Sonderpunkt verliehen :)
>
> Beispielanwendung.
> z.B. Iteratoren über ein file, die eine Zahl zurückgeben.
> Wenn man mit einer Referenz arbeitet, dan kann man damit Konstrukte
> ala
> while(iteratorref)
> verwenden,
> ansonsten würde
> while(iterator) abbrechen wenn eine 0 in der Datei steht.
>
> Class::Std blessed übrigens skalare Referenzen als Objekte.
> Insofern ist die G'schicht weniger weit hergeholt als man denken mag.
Referenzen sind sinnvoll. Auch Referenzen auf Skalare sind sinnvoll.
Es ist aber nicht sinnvoll, wenn man den Wert eines Skalar
testen will, dessen Referenz zu testen. Das war Dein Vorschlag.
Nix für ungut, wir alle verirren uns mal in dem
Universum an Möglichkeiten, das Perl vor uns ausbreitet ;)
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
Re: 0e0 ist TRUE?
am 11.03.2006 18:26:34 von unknown
>
>Diese Sichtweise erhält von mir für ihre Abstrusität
>einen Sonderpunkt verliehen :)
Beispielanwendung.
z.B. Iteratoren über ein file, die eine Zahl zurückgeben.
Wenn man mit einer Referenz arbeitet, dan kann man damit Konstrukte
ala
while(iteratorref)
verwenden,
ansonsten würde
while(iterator) abbrechen wenn eine 0 in der Datei steht.
Class::Std blessed übrigens skalare Referenzen als Objekte.
Insofern ist die G'schicht weniger weit hergeholt als man denken mag.
----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= East/West-Coast Server Farms - Total Privacy via Encryption =---
Re: 0e0 ist TRUE?
am 12.03.2006 11:23:09 von Torsten Mohr
Hallo,
> nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
> Muà ich '0e0' als String verwenden, damit es TRUE ist?
Hintergrund meiner Frage ist, daà ich mal gelesen habe
(sorry, hab die Quelle nicht mehr) daà 0e0 zwar 0 ist,
aber trotzdem TRUE ist. Das trifft auf 0e0 ALS ZAHL ja
nach dem Beispiel nicht zu, nur auf den STRING '0e0'.
GrüÃe,
Torsten.
Re: 0e0 ist TRUE?
am 12.03.2006 16:34:32 von Christian Lackas
* Torsten Mohr [2006-03-12]:
Hallo Torsten,
> > nach dem kurzen Testskript hier ist 0e0 als Zahl FALSE.
> > Muß ich '0e0' als String verwenden, damit es TRUE ist?
> Hintergrund meiner Frage ist, daß ich mal gelesen habe
> (sorry, hab die Quelle nicht mehr) daß 0e0 zwar 0 ist,
> aber trotzdem TRUE ist. Das trifft auf 0e0 ALS ZAHL ja
> nach dem Beispiel nicht zu, nur auf den STRING '0e0'.
wenn du Perl in einem numerischen Kontext »0e0« gibst, dann wird es das
direkt als Fließkommazahl 0 abspeichern. Da gibt es dann ja keinen
Unterschied zwischen 0, 0.0 oder 0.000 oder halt 0e0. Dadurch 'sieht'
der Bytecode-Interpreter gar nicht ob du »0« oder »0e0« verwendet hast.
Gruß
Christian
--
Der Computer ist die logische Weiterentwicklung des Menschen:
Intelligenz ohne Moral.
(John Osborne, engl. Dramatiker, 1921-1994)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: 0e0 ist TRUE?
am 12.03.2006 16:52:11 von Thomas Wittek
> Hintergrund meiner Frage ist, daà ich mal gelesen habe
> (sorry, hab die Quelle nicht mehr) daà 0e0 zwar 0 ist,
> aber trotzdem TRUE ist.
Wird möglicherweise in der DBI-Dokumentation gewesen sein:
http://search.cpan.org/~timb/DBI-1.50/DBI.pm
-Thomas
Re: 0e0 ist TRUE?
am 13.03.2006 22:33:33 von Torsten Mohr
Hallo,
> wenn du Perl in einem numerischen Kontext »0e0« gibst, dann wird es das
> direkt als FlieÃkommazahl 0 abspeichern. Da gibt es dann ja keinen
> Unterschied zwischen 0, 0.0 oder 0.000 oder halt 0e0. Dadurch 'sieht'
> der Bytecode-Interpreter gar nicht ob du »0« oder »0e0« verwendet hast.
ja, da ist richtig. Danke an alle für die Erläuterungen.
GrüÃe,
Torsten.