Schrift
[thread]12829[/thread]

requires explicit package name

Leser: 3


<< >> 8 Einträge, 1 Seite
Kean
 2008-11-26 15:40
#116622 #116622
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ich verwende use strict; und bekomme die Fehlermeldung:

Code: (dl )
Global symbol "$suchwort_ent" requires explicit package name at programm.pl line 139.


$suchwort_ent ist wie folgt definiert:

Code (perl): (dl )
1
2
my $suchwort_ent = $page1->Entry( -relief => "sunken"
                         )->place( -x => 30, -y => 492, -height => 22, -width => 273);


und wird in Zeile 139 wie folgt angesprochen:

Code (perl): (dl )
1
2
3
4
my $page1 = $nb->add('1', -label => 'TEST', -underline => '0',
                                                                                                                        -raisecmd => sub { $suchwort_ent->focus();
                                                                                                                                                 $mw->bind ('<Return>' });
                                                                                                                                                 });


Woran liegt es das hier diese Fehler auftritt? Das einzigste was mir dabei auffällt ist das der Aufruf in Zeile 139 passiert und die deklaration in Zeile 171. Kann es daran liegen?
pq
 2008-11-26 15:46
#116625 #116625
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
die deklaration muss natürlich vor der ersten benutzung passieren, und im selben gültigkeitsbereich.
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
Kean
 2008-11-26 15:56
#116627 #116627
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Wenn ich nicht use strict nutze funktioniert es auch mit der umgekehrten Reihenfolge. Sicher das es nur so geht? Der erste aufruf erfogt ja nicht vor der deklaration....
pktm
 2008-11-26 16:49
#116630 #116630
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Kean+2008-11-26 14:56:33--
Wenn ich nicht use strict nutze funktioniert es auch mit der umgekehrten Reihenfolge. Sicher das es nur so geht? Der erste aufruf erfogt ja nicht vor der deklaration....


Ja, im Grunde hast du schon den Grund genannt, strict zu benutzen :)

Wann immer du in einem Codeblock eine Variable verwenden willst, musst du sie vorher deklarieren.

Wenn du dein Programm so aufbaust, dass du in einer Initialisierungsmethode deine GUI bastelst, ist alles i.O., wenn du es anders machst, ist das Prog wahrschenlich schlecht konzipiert.

Aber um das zu beurteilen, müssten wir mehr Code sehen.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2008-11-26 18:07
#116632 #116632
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Kean+2008-11-26 14:56:33--
Wenn ich nicht use strict nutze funktioniert es auch mit der umgekehrten Reihenfolge. Sicher das es nur so geht? Der erste aufruf erfogt ja nicht vor der deklaration....

hast du aber eben gesagt. also räumlich liegt die deklaration nach dem aufruf, aber zeitlich
davor? dann solltest du mal was über gültigkeitsbereiche lernen.
Wiki:UseStrict
ohne strict kann das dann aber auch nur gehn, wenn du das my() weglässt.
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
murphy
 2008-11-26 21:50
#116636 #116636
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
pq+2008-11-26 17:07:00--
[...] also räumlich liegt die deklaration nach dem aufruf, aber zeitlich
davor? dann solltest du mal was über gültigkeitsbereiche lernen. [...]


Ich finde ja eher, der Perlinterpreter sollte mal etwas über Gültigkeitsbereiche lernen. Forwarddeklarationen wie in C, um gegenseitig rekursive Subroutinen schreiben zu können, sind voll uncool ;-)
When C++ is your hammer, every problem looks like your thumb.
moritz
 2008-11-27 00:28
#116642 #116642
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
murphy+2008-11-26 20:50:22--
Ich finde ja eher, der Perlinterpreter sollte mal etwas über Gültigkeitsbereiche lernen. Forwarddeklarationen wie in C, um gegenseitig rekursive Subroutinen schreiben zu können, sind voll uncool ;-)


Braucht man doch gar nicht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;

sub a {
    my $x = shift;
    if ( $x < 0 ) {
        print "done\n";
    } else {
        b($x - 2);
    }
}

sub b {
    return a(shift() + 1);
}

a(5);


wo siehst du hier den Bedarf an Forward-Deklarationen?
murphy
 2008-11-27 02:53
#116646 #116646
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
moritz+2008-11-26 23:28:11--
[...] wo siehst du hier den Bedarf an Forward-Deklarationen?


Der entsteht, sobald man Prototypen verwendet, was ich fast immer tue.

Außerdem sehe ich auch nicht ein, warum Variablen auf Modulebene lexikalisch vor ihrer Verwendung deklariert werden sollen. Es gibt noch nicht einmal die Möglichkeit, mit einer bestimmten Syntax einen Kontext zu erzeugen, in dem sich Variablen gegenseitig referenzieren können, was durchaus nützlich wäre, wenn man den Variablen zum Beispiel anonyme Subroutinen zuweisen möchte. Das halte ich für einen Defekt, wenn auch nicht für einen schwerwiegenden.

Oh, und bevor jetzt jemand ankommt und sagt, dass man so etwas auch ohne spezielle Syntax durch Mutation emulieren kann: Ich bin Purist und Fan von funktionaler Programmierung, Mutation gilt nicht bzw. sie ist einfach nicht elegant ;-)
When C++ is your hammer, every problem looks like your thumb.
<< >> 8 Einträge, 1 Seite



View all threads created 2008-11-26 15:40.