globale variablen

globale variablen

am 08.02.2007 09:36:54 von Frank Kulow

Guten Morgen,

ich bin nicht sor recht glücklich über die reichliche Verwendung
globaler Variablen. Manches wird eben an ganz anderer Stelle angelegt
als es später gebraucht wird. Durch Objektorientierung läßt sich nur
einiges abfangen. Am schlimmsten ist es bei Verwendung von Tk. Im
Beispiel könnte ich zwar anikey und guimain Argumente übergeben, die
dann $::guiinp vermeiden ließen, sobald das Programm größer wird
handhabt sich es so auch nicht gut. Wie löst Ihr so was?

Gruß und danke

Frank



use strict;
use Tk;

my$mw = MainWindow->new;
my$t2=$mw->Text()->pack;
$t2->markSet('aktend','end -1 char');
$t2->bind( '',\&anikey);
$mw->repeat(500,[\&guimain]);
MainLoop;


sub anikey
{
$::guiinp=$_[0]->get('aktend -1 char','end -1 char');
$_[0]->markSet('aktend','end -1 char');
}

sub guimain
{
print "$::guiinp\n";
}

Re: globale variablen

am 08.02.2007 16:44:54 von Ch Lamprecht

Frank Kulow schrieb:
> Guten Morgen,
>
> ich bin nicht sor recht glücklich über die reichliche Verwendung
> globaler Variablen. Manches wird eben an ganz anderer Stelle angelegt
> als es später gebraucht wird. Durch Objektorientierung läßt sich nur
> einiges abfangen. Am schlimmsten ist es bei Verwendung von Tk. Im
> Beispiel könnte ich zwar anikey und guimain Argumente übergeben, die
> dann $::guiinp vermeiden ließen, sobald das Programm größer wird
> handhabt sich es so auch nicht gut. Wie löst Ihr so was?
>
> Gruß und danke
>
> Frank
>
>
>
> use strict;
> use Tk;
>
> my$mw = MainWindow->new;
> my$t2=$mw->Text()->pack;
> $t2->markSet('aktend','end -1 char');
> $t2->bind( '',\&anikey);
> $mw->repeat(500,[\&guimain]);
> MainLoop;
>
>
> sub anikey
> {
> $::guiinp=$_[0]->get('aktend -1 char','end -1 char');
> $_[0]->markSet('aktend','end -1 char');
> }
>
> sub guimain
> {
> print "$::guiinp\n";
> }
Hallo,

Dein Programm lässt sich auf das folgende verkürzen (Aber tut es wirklich das,
was du möchtest?):

use warnings;
use strict;
use Tk;

my$mw = MainWindow->new;
my$t2=$mw->Text()->pack;
$mw->repeat(500,sub{print $t2->get('end -2 chars'),"\n"});
MainLoop;


Wenn es darum geht, eine Variable einer begrenzten Anzahl von subs zur verfügung
zu stellen, dann könntest du einen Block und lexikalische Variablen verwenden:
{
my $count = 0;
sub incr{$count++}
sub decr{$count--}
sub show{print "count: $count\n"}
}

Christoph

--
use Tk;$c=tkinit->Canvas->pack;for(split('','elHce utaohrPr akrJs nte'))
{$c->createText(50*sin($x-=.503)+100,50*cos($x)+100,-text=>$ _);
$c->update;sleep 1 }sleep 10;