Schrift
[thread]10124[/thread]

Auf lokale Variablen global zugreifen



<< >> 4 Einträge, 1 Seite
Kean
 2007-08-18 16:22
#98364 #98364
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ich bin gerade dabei alles so umzustellen, dass ich use strict endlich aktivieren kann ;)

Jetzt bin ich auf ein Problem gestossen:

Ich habe eine Subroutine die ein neues Fenster(Toplevel) erzeugt. In diesem Fenster befinden sich Textfelder(Labels) welche mit Daten gefüllt werden.

Früher hatte ich eine zweite Subroutine welche die Daten aktualisiert hat. Diesen aktualisierungsvorgang hatte ich in einer eigenen Sub da ich ihn immer wieder brauchte und kein copy and paste wollte.

Jetzt wo ich die Variablen welchen ich die Labels zugeordnet habe aber mit my deklariert habe, kann ich nicht mehr aus dem zweiten Sub auf diese Variablen zugreifen.

Gibt es also eine Möglichkeit von Außen auf die Variabeln zuzugreifen?

Um das ganze zu verdeutlichen habe ich mal die beiden Subroutinen angehängt.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
sub exportieren
{
my $auswahl_chkb1 = 0;
my $auswahl_chkb2 = 0;
my $auswahl_chkb3 = 0;
my $auswahl_chkb4 = 0;

my $export_tw = $mw->Toplevel();

my      $windowHeight       = "300";
my      $windowWidth        = "540";
my      $screenHeight       = $export_tw->screenheight;
my      $screenWidth        = $export_tw->screenwidth;
$export_tw->geometry($windowWidth."x".$windowHeight);
$export_tw->geometry("+".int($screenWidth/2 - $windowWidth/2)."+".int($screenHeight/2 - $windowHeight/2));

my $f1_tw = $export_tw->LabFrame(-label => "Ziel wählen",-labelside => 'acrosstop')->place(-x => 20,
                                                                                  -y    => 30,
                                                                                  -height => 65, -width => 500
                                                                                  );

my $Label1_tw = $export_tw->Label(-text => "Export von Schülerdaten:",-anchor => 'w')->place( -x => 21, -y => 10, -height => 21, -width => 493);

my $Label2_tw = $f1_tw->Label(-text => "Ziel-Datei:")->place( -x => 5, -y => 5, -height => 23, -width => 74);


my $Entry1_tw = $f1_tw->Entry(-width => 50, -relief => "sunken")->place( -x => 79, -y => 5, -height => 24, -width => 224);
$Entry1_tw->delete(0, 'end');
$Entry1_tw->insert('end', 'C:\');
#$pfad = $Entry1_tw->get();
&Speicher_aktualisieren; 

my $Button1_tw = $f1_tw->Button(-text    => 'Durchsuchen',
                           -relief => "raised",
                           -command =>
                             sub { if (my $TargetFolder = BrowseForFolder("Bitte wählen Sie den Ziel-Ordner", CSIDL_DESKTOP))
                                                                                {
                                                                                $Entry1_tw->delete(0, 'end');
                                                                                $Entry1_tw->insert('end', $TargetFolder);
                                                                                &Speicher_aktualisieren; 
                                                                                }
                             },
                        )->place( -x => 308, -y => 5, -height => 24, -width => 152);

my $f2_tw = $export_tw->LabFrame(-label => "Auswahl",-labelside => 'acrosstop')
                                                                                        ->place(-x => 20, -y => 100, -height => 125, -width => 245);                                            
                                                
$f2_tw->Checkbutton( -text => "Schüler Datenbank",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb1
                                     )->place( -x => 0, -y => 0, -height => 22, -width => 100);
                                                                         
$f2_tw->Checkbutton( -text => "Buchungsdaten",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb2
                                     )->place( -x => 0, -y => 24, -height => 22, -width => 100);
                                                                         
$f2_tw->Checkbutton( -text => "Bilddateien",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb3
                                     )->place( -x => 0, -y => 48, -height => 22, -width => 100);                                                                         
                                                                         
$f2_tw->Checkbutton( -text => "Alles",
                                        -anchor => "w",
                                        -command => \&Speicher_aktualisieren,
                                     -variable => \$auswahl_chkb4
                                     )->place( -x => 0, -y => 72, -height => 22, -width => 100);                                                                         
                                                                         
my $f3_tw = $export_tw->LabFrame(-label => "Speicher",-labelside => 'acrosstop')
                                                                                        ->place(-x => 270, -y => 100, -height => 125, -width => 245);                                                                                                                    
                                                
$f3_tw->Label( -text => "Speicherbedarf:",
                                  -anchor => 'w'
                                )->place( -x => 0, -y => 0, -height => 20, -width => 100);
                                                
$f3_tw->Label( -textvariable => \$speicherbedarf,
                                  -anchor => 'e',
                                  -foreground => 'blue'
                                )->place( -x => 110, -y => 0, -height => 20, -width => 100);

$f3_tw->Label( -text => "Freier Speicher:",
                                  -anchor => 'w'
                                )->place( -x => 0, -y => 25, -height => 20, -width => 100);                             
                                
$f3_tw->Label( -textvariable => \$freierspeicher,
                                  -anchor => 'e',
                                  -foreground => 'blue'
                                )->place( -x => 110, -y => 25, -height => 20, -width => 100);
                                
                                                
$Label3_tw = $export_tw->Label( -textvariable => \$var_status_tw,
                                  -anchor => 'w',
                                  -foreground => 'red'
                                )->place( -x => 74, -y => 230, -height => 20, -width => 300);
$var_status_tw = "";

my $Button2_tw = $export_tw->Button(
                           -text => "Sichern",
                           -relief => "raised",
                           -command => sub {
                                                                my $pfad = $Entry1_tw->get();
                                                                if ( $pfad eq "" ) { $var_status_tw = "Fehler: Bitte geben Sie einen gültigen Pfad an!"; $Label3_tw->configure(-foreground => 'red'); return; }
                                                                my @target = ();
                                                                my @folder = ();
                                                                print "1:$auswahl_chkb1 ";
                                                                print "2:$auswahl_chkb2 ";
                                                                print "3:$auswahl_chkb3 ";
                                                                print "4:$auswahl_chkb4\n";
                                                                if ( $auswahl_chkb4 == 1 )
                                                                        {
                                                                        @folder2 = Foldercont(".");
                                                                        shift @folder2;
                                                                        
                                                                        foreach(@folder2)
                                                                                {
                                                                                my $pfad2 = $_;
                                                                                $pfad2 = reverse($pfad2);
                                                                                chop $pfad2;
                                                                                chop $pfad2;
                                                                                $pfad2 = reverse($pfad2);
                                                                                push @folder, "\.\\$pfad2";
                                                                                push @target, "$pfad$pfad2\n";
                                                                                }
                                                                        }
                                                                else
                                                                        {
                                                                        if ( $auswahl_chkb1 == 1 )
                                                                                {
                                                                                push @folder, ".\\schueler.csv";
                                                                                push @target, $pfad."schueler.csv";
                                                                                }
                                                                        if ( $auswahl_chkb2 == 1 )
                                                                                {
                                                                                my @folder2 = Foldercont(".\\daten");
                                                                                shift @folder2;
                                                                                foreach(@folder2)
                                                                                        {
                                                                                        my $pfad2 = $_;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        chop $pfad2;
                                                                                        chop $pfad2;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        push @folder, "\.\\$pfad2";
                                                                                        push @target, "$pfad$pfad2\n";
                                                                                        }
                                                                                }
                                                                        if ( $auswahl_chkb3 == 1 )
                                                                                {
                                                                                my @folder2 = Foldercont(".\\bilder");
                                                                                shift @folder2;
                                                                                foreach(@folder2)
                                                                                        {
                                                                                        my $pfad2 = $_;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        chop $pfad2;
                                                                                        chop $pfad2;
                                                                                        $pfad2 = reverse($pfad2);
                                                                                        push @folder, "\.\\$pfad2";
                                                                                        push @target, "$pfad$pfad2\n";
                                                                                        }
                                                                                }
                                                                        }
                                                                #if (CopyEx (\@folder => \@target, FOF_NOCONFIRMMKDIR))
                                                                #               {
                                                                #               $mw->messageBox(-icon => 'info', -message => "Das Backup wurde erfolgreich erstellt!       ", -title => 'Herzlichen Glückwunsch', -type => 'Ok', -default => 'Ok');
                                                                #               }
                                                                #       else
                                                                #               {
                                                                #               $mw->messageBox(-icon => 'info', -message => "Fehler beim kopieren aufgetreten!       ", -title => 'Fehler!', -type => 'Ok', -default => 'Ok');
                                                                #               }
                                                                my $cnt = 0;
                                                                foreach (@target)
                                                                        {
                                                                        print "$cnt:$folder[$cnt] - $target[$cnt]\n";
                                                                        $cnt++;
                                                                        }
                                                                        print "\nAnzahl: $cnt\n-------------------------------\n";
                                                        }
                           )->place( -x => 43, -y => 265, -height => 23, -width => 136);

my $Button3_tw = $export_tw->Button(
                           -text => "Abbrechen",
                           -relief => "raised",
                           -command => sub { $export_tw->destroy() }
                           )->place( -x => 361, -y => 265, -height => 23, -width => 136);

my $Label4_tw = $export_tw->Label(-text => "Status:",-anchor => 'w')->place( -x => 24, -y => 230, -height => 20, -width => 50);

$export_tw->bind ('<Escape>', sub{ $export_tw->destroy() });
$Button1_tw->focus();
}

sub Speicher_aktualisieren
        {
        my $summe = 0;
        my @zwischensumme;
        if ( $auswahl_chkb1 == 1 ) 
                {
                $summe = $summe + -s 'schueler.csv';
                }
        if ( $auswahl_chkb2 == 1 ) 
                {
                @zwischensumme = Foldercont(".\\daten");
                $summe = $summe + $zwischensumme[0];
                }
        if ( $auswahl_chkb3 == 1 ) 
                {
                @zwischensumme = Foldercont(".\\bilder");
                $summe = $summe + $zwischensumme[0];
                }
        if ( $auswahl_chkb4 == 1 ) 
                {
                @zwischensumme = Foldercont(".");
                $summe = $zwischensumme[0];
                $auswahl_chkb1 = 1;
                $auswahl_chkb2 = 1;
                $auswahl_chkb3 = 1;
                }
        $speicherbedarf = sprintf("%.2f", $summe/1048576)." MB";
        my $pfad = $Entry1_tw->get();
        if (GetDiskFreeSpace $pfad)
                {
                $freierspeicher = GetDiskFreeSpace $pfad;
                $freierspeicher = sprintf("%.2f", $freierspeicher/1048576)." MB";
                }
        }
moritz
 2007-08-18 20:34
#98368 #98368
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ohne den ganzen Code durchgelesen zu haben: Wenn du die Variable vor den Funktionen deklarierst, geht es:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $foo;

sub sub1 {
    $foo = 3;
}

sub sub2 {
    print $foo;
}

sub1();
sub2();
Kean
 2007-08-18 21:51
#98369 #98369
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ja wenn ich Sie aber vor den Subs deklariere sind sie wärend der ganzen Laufzeit des Programms deklariert und belegen Speicher soviel ich weiss. Das wollte ich ja mit der deklarierung umgehen.

Wenn ich das zweite Sub in das erste reinschreibe bringt er mir immer die Fehlermeldung

Code: (dl )
1
2
Variable "$auswahl_chkb1" will not stay shared at C:\Dokumente und Einstellungen
\Kai\Desktop\preCount 0.9.1\preCount.pl line 1387, <DATA> line 164.


Was ich nicht ganz verstehe. Aber ich vermute das es nicht sauber ist ein sub in einen anderen sub zu stecken.
topeg
 2007-08-18 23:40
#98371 #98371
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
3
4
5
6
7
sub Speicher_aktualisieren($$$$)
{
  # Variablenwerte übernehmen:
  my ($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4)=@_;
  # ...
  # weiter wie bisher
}


Der Aufruf:
Code (perl): (dl )
Speicher_aktualisieren($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4)


Über gib den Inhalt Variablen an die Funktion. Du brauchst keine globalen Variablen zu verwenden.

EDIT:
Ach etwas habe ich übersehen. Wenn Werte wieder zurückgegeben werden sollen kann man da so machen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub Speicher_aktualisieren($$$$)
{
  # Variablenwerte übernehmen:
  my ($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4)=@_;
  # ...
  # weiter wie bisher
  # ...
  #Werte rurückgeben:
  return ($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4,$summe);
}


Der Aufruf dann:
Code (perl): (dl )
($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4,$summe)=Speicher_aktualisieren($auswahl_chkb1,$auswahl_chkb2,$auswahl_chkb3,$auswahl_chkb4)
<< >> 4 Einträge, 1 Seite



View all threads created 2007-08-18 16:22.