Schrift
[thread]11990[/thread]

Klammer-Fehler in if-Abfrage/Dereferenzierung -- Warum keine Fehlermeldung?



<< >> 5 Einträge, 1 Seite
FoolAck
 2008-06-07 15:40
#110853 #110853
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
use strict; use warnings;

sub foo {}
my @field = ([], [], []);

if (${field [0][0] and not foo())} {print "ok\n"}
else {print "lolwut? o0\n"}

Kompiliert ohne Fehler und perl -c sagt auch "Syntax ok".
Der subtile Fehler ist die fehlende geschwiffene Klammer bei der Dereferenzierung. (${field [0][0] <- Da müsste sie hin, stattdessen kommt sie später. Nämlich nach dem Ende der if-Bedingung)
Dadurch sind die Rundklammern im Konditional ja eigentlich unbalanciert (oder zumindest innerhalb der curly-Braces). Ich verstehs nicht, hier meckert perl auch (wie zu erwarten) rum:
Code: (dl )
1
2
3
4
5
6
use strict; use warnings;

sub foo {}
my @field = ([], [], []);

print ${field [0][0] and not foo())}
STDERR
syntax error at - line 5, near "))"
Execution of - aborted due to compilation errors.

Warum dann nicht beim ersten Beispiel? 0o (Ich steh auf'm Schlauch. Hab den Fehler auch nur durch Zufall gefunden. (Wie sowas passieren kann ist wieder ne andere Frage, aber offensichtlich kann es passieren.))

Perl-Version ist 5.8.8, OS ubuntu gutsy (obwohl ich mir nicht vorstellen kann, dass das OS von Relevanz sein sollte).
Code: (dl )
1
2
3
4
5
6
$ perl --version

This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
[...]
$ uname -a
Linux localhost 2.6.22-14-rt #1 SMP PREEMPT RT Tue Feb 12 09:57:10 UTC 2008 i686 GNU/Linux
Gast Gast
 2008-06-07 16:07
#110855 #110855
im zweiten Beispiel wegen dem fehlenden if nicht "foo())}" sondern "foo()}"
FoolAck
 2008-06-07 16:59
#110857 #110857
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Schon klar, allerdings nicht wegen fehlendem if, sondern wegen fehlender eröffnender Klammer:
Code: (dl )
1
2
3
4
5
6
use strict; use warnings;

sub foo {}
my @field = ([], [], []);

print STDOUT (${field [0][0] and not foo())}

gibt nur:
STDERR
Use of uninitialized value in print at - line 6.
Was mit meinem Problem ja nichts zu tun hat, das @field array ist halt leer...
(edit: arg, dass array wird ja garnicht geprintet. aber die Überprüfung liefert false (hier wahrscheinlich undef) zurück..)

Die Frage bleibt, warum eine Klammerung dieser Art:
Code: (dl )
( { ) }

keinen Syntax-Fehler darstellt...

Die if-Abfrage generell scheint übrigens zu funktionieren:
Code: (dl )
1
2
3
4
5
6
use strict; use warnings;

my @field = ([1], [0]);

if ( ${field[0][0]) } {print "feld [0]->[0] ist OK"}
if ( ${field[1][0]) } {print "feld [1]->[0] ist OK"}
pq
 2008-06-07 17:50
#110858 #110858
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
so kurz wie's geht:
Code (perl): (dl )
print 1 if ( ${ field[0] ) }


kompiliert hier auch.
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
kann das jemand mit 5.10 testen?

edit: mit 5.10 dasselbe. bleadperl?

ansonsten einen bugreport aufmachen...

edit2: in bleadperl dasselbe. ich frag grad nach, ob ein bugreport aufgemacht werden sollte.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2008-06-07 19:26
#110864 #110864
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, mach am besten einen Bugreport auf. Aber bitte nicht auf CPAN, sondern über perlbug...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 5 Einträge, 1 Seite



View all threads created 2008-06-07 15:40.