Schrift
[thread]7380[/thread]

falsche bedingung in if-block ?!



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
popcorn5
 2005-10-21 10:42
#59099 #59099
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
Hallo,

es ist mir schon einwenig peinlich, sowas hier zu fragen...

was soll daran bitte falsch sein ?

Code: (dl )
1
2
3
4
5
6
my @test=("1","");

if($test[1] eq "")
{
#tu was...
}


bekomme dabei den meckercode: Use of uninitialized value in string eq...

danke\n\n

<!--EDIT|popcorn5|1129879940-->
esskar
 2005-10-21 11:21
#59100 #59100
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
wie wäre mit
Code: (dl )
1
2
if($test[1] eq "") {
}
popcorn5
 2005-10-21 11:33
#59101 #59101
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
hab beim eingeben nen fehler gemacht, in meinem script steht es richtig drin, problem besteht weiterhin.
Ronnie
 2005-10-21 11:37
#59102 #59102
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Davon abgesehen das das if vor die Klammer gehört, ist "" nur ein leerer String und als solcher false, du vergleichst also false mit false in einem Stringkontext (durch eq), was erwartest du den da?
Dubu
 2005-10-21 11:38
#59103 #59103
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Sorry, das kann ich nicht nachvollziehen.
Code: (dl )
1
2
3
4
5
6
7
8
9
~$ perl -Mwarnings -Mstrict -le 'my @test=("1","");

if($test[1] eq "")
{
  print "ist gleich"
}
'
ist gleich
~$

Kein Fehler, keine Warnung.
esskar
 2005-10-21 11:40
#59104 #59104
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
@ronnie, format_c:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Dokumente und Einstellungen\sak>perl
use strict;
use warnings;
print ("" eq "");
^Z
1
C:\Dokumente und Einstellungen\sak>perl
use strict;
use warnings;

my @test = ("1", "");
if($test[1] eq "") {
print "foo\n";
}
^Z
foo

C:\Dokumente und Einstellungen\sak>


man sieht also, denn code denn du gepostet hast, spiegelt nicht deine wahrheit wieder.
Ronnie
 2005-10-21 11:54
#59105 #59105
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@esskar: Ja, war mir schon klar, nur verstehe ich auch einfach nicht auf was er da hinaus will. Wahrscheinlich ist das Array an dieser Stelle undef, aber es ist doch insgesamt strange?!
Dubu
 2005-10-21 12:25
#59106 #59106
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Ronnie,21.10.2005, 09:37]..., ist "" nur ein leerer String und als solcher false,
[/quote]
Ein Leerstring ist erstmal nur ein Leerstring. Erst im Booleschen Kontext ist er false, im numerischen Kontext dagegen 0 (und erzeugt evtl. eine Warnung).

Quote
du vergleichst also false mit false in einem Stringkontext (durch eq), was erwartest du den da?

Nein, er vergleicht einen Leerstring mit einem Leerstring im Stringkontext.

Preisfrage: "" ist false im Booleschen Kontext. 0 ist false im Booleschen Kontext. Was ist dann, wenn ich ("" eq 0) teste?

Antwort: Der Vergleich findet auch hier im Stringkontext, nicht im Booleschen Kontext statt. Die 0 im Stringkontext ergibt "0", und das ist natuerlich verschieden von "".
popcorn5
 2005-10-21 16:33
#59107 #59107
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
ich hab ja nicht mein ganzes script hier reingeschrieben, sondern nur das was wichtig ist. und weil ich diese warnung nicht verstehe frage ich ja !?

ich habs jetzt aber raus, naja, wieder mal gebastel. wenn ich in $_[1] zuvor irgendwas reinschreibe zb.: "1" und dann wieder lösche $_[1]=""; dann bekomme
ich seltsamerweise kein warnung ??? habs auf nem anderen rechner getestet, da läufts ohne warnung. nur auf der 98er krücke gibts die warnung.
Taulmarill
 2005-10-21 16:59
#59108 #59108
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich glaube wir kommen der sache näher. du hast also ein script gepostet, von dem du glaubst, dass es deinen fehler reproduziert?!? so können wir dir natürlich nicht helfen.

also, zuerst einmal ist "" nicht gleich 0 nicht gleich undef. wenn du testen willst, ob eine variable undef ist, kannst du so etwas machen.
Code: (dl )
if ( defined $foo ) { print "definiert\n" } else { print "nicht definiert\n" }

wenn du allerdings nur testen willst, ob die variable einen leerstring enthält, bekommst du eine warnung, wenn die variable undef ist. so etwas kann man folgendermassen umgehen
Code: (dl )
if ( defined $foo and $foo ne "" ) { print "da is was\n" } else { print "da is nix\n" }

man sieht auch oft, dass programmierer etwas wie if ( $foo ) {} verwenden. bedenke aber, dass so ein "vergleich" auch false ist, wenn $foo = "0";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-10-21 10:42.