Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5755[/thread]

lokale Variable aus Sub ins Hauptprogramm!



<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
skontox
 2003-09-24 21:07
#55898 #55898
User since
2003-08-06
193 Artikel
BenutzerIn
[default_avatar]
Guten Tag!
Ich wollte nun endlich mal vernünftig programmieren. :-)
Das heißt use strict und co. einbinden. Dazu muß ich allerdings vermeiden globale Variablen zubenutzen und mich ab jetzt nur noch mit lokale Variablen abgebe. Jetzt möchte ich allerdings noch mal genau wissen, wie ich aus einer Sub eine lokale Variable dem Hauptprogramm bekannt gebe.

Z.B habe ich eine Sub in der ein Fenster erzeugt wird. Dieses Fenster nennt sich my $hilfefenster, ich möchte nun dieses Fenster schließen, wenn ich in einem anderen Fenster auf einem Knopf drücke. Bislang habe ich so ein Hilfsfenster als global deklariert und konnte an jeder von mir gewünschten Stelle dieses Fenster beeinflussen bzw. schließen.

Könnte mir da jemand bitte auf die Sprünge helfen, wie man soetwas mit lokalen Variablen gewährleisten kann. geht das nur mit return...?

Gruß skontox\n\n

<!--EDIT|skontox|1064423412-->
Ishka
 2003-09-24 22:06
#55899 #55899
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wenn eine Variable dem Hauptprogramm 'bekannt' ist, dann ist sie global.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
betterworld
 2003-09-24 22:10
#55900 #55900
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn Du die globalen Variablen als $irgendwas::nochwas schreibst, kannst Du sie auch mit strict verwenden.

Ansonsten wuerd ich Dir empfehlen, mal Exporter anzugucken.\n\n

<!--EDIT|betterworld|1064427077-->
skontox
 2003-09-24 22:25
#55901 #55901
User since
2003-08-06
193 Artikel
BenutzerIn
[default_avatar]
Wie macht Ihr denn soetwas?

Wie kann ich denn auf die lokale Variable von außen zugreifen?
Gar nicht mehr? Heißt dass das Fenster kann dann nie mehr geschlossen werden, es sei denn ich beende das komplette Programm?

An betterworld: Kannst Du das nochmal etwas weiter erleutern. was das bedeutet.

Gruß skontox
Ishka
 2003-09-24 22:44
#55902 #55902
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich kann dir das auch erklären. Es gibt Namensräume. Lass mal dieses Beispiel lauzfen, vielleicht wird es dir klar:
Code: (dl )
1
2
3
4
5
6
7
package main;# kann man auch weglassen, ist voreinstellung
$var="Welt\n";
package hallo;
$var="Hallo ";
print $var;
package main;
print $var;

und mit $namensraum::variable kannst du auf eine Variable in einem anderen Namensraum zugreifen.

Statt Variablen global zu machen, übergib lieber eine Refferenz auf sie.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
skontox
 2003-09-24 22:53
#55903 #55903
User since
2003-08-06
193 Artikel
BenutzerIn
[default_avatar]
Danke erstmal Ishka!

Code: (dl )
Statt Variablen global zu machen, übergib lieber eine Refferenz auf sie. 


Kannst Du mir da mal bitte ein kleines Beispiel posten.
Sprich eine Variable lokal in einer Sub erzeugen und dann als Referenz zu übergeben.

Nur das ich mir mal einen Beispielecode anschauen kann, der mein Problem löst

Gruß skontox
Ishka
 2003-09-24 23:15
#55904 #55904
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
blubb(blah(),'zwei');

sub blah
{
my %h=(eins=>1,zwei=>2,drei=>3);
return \%h;
}

sub blubb
{
print $_[0]->{$_[1]}
}
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
format_c
 2003-09-24 23:16
#55905 #55905
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Naja ich würde es so machen.
Code: (dl )
1
2
3
4
5
6
7
8
sub irgendwas {
my $var = "hallo Welt";
# do something else

return $var;
}

my $var = irgendwas();


Gruß Alex
skontox
 2003-09-24 23:23
#55906 #55906
User since
2003-08-06
193 Artikel
BenutzerIn
[default_avatar]
Gut Ok! Das mache ich ja auch Teilweise. aber wie lösche ich nun die Variable my $var, wenn Sie ein Fenster darstellt?

Gruß skontox
Ishka
 2003-09-24 23:30
#55907 #55907
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=format_c,24.09.2003, 21:16]Naja ich würde es so machen.
Code: (dl )
1
2
3
4
5
6
7
8
sub irgendwas {
my $var = "hallo Welt";
# do something else

return $var;
}

my $var = irgendwas();


Gruß Alex[/quote]
Das geht aber nicht bei komplexeren Datenstrukturen. die oG. Refferenzen schon.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2003-09-24 21:07.