Strat, Fortgeschrittene Perl-Programmierung
Closures
Eine my-Variable ist nur in dem Block { } (und untergeordneten) gültig, in dem sie deklariert wurde, und ist von außerhalb unsichtbar.
In Perl kann man Blöcke schachteln, und auch beliebige leere Blöcke anlegen.
In einen leeren Block kann man auch Subroutinen reinschreiben
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
01:
02: use warnings;
03: use strict;
04:
05:
06: {
07: my $counter = 0;
08:
09: sub ZaehleHoch {
10: $counter++;
11: }
12:
13: sub ZaehleRunter {
14: $counter--;
15: }
16:
17: sub GibMirDenCounterWert {
18: return $counter;
19: }
20:
21:
22: }
23:
24:
25: print &GibMirDenCounterWert(), "\n";
26: for my $i (1..20) {
27: &ZaehleHoch();
28: }
29: print &GibMirDenCounterWert(), "\n";
30: for my $i (4..9) {
31: &ZaehleRunter();
32: }
33: print &GibMirDenCounterWert(), "\n";
Zeile 6-22: dies ist ein leerer Block, in den eine Variable $counter und einige Subroutinen eingeschlossen sind. Die Variable ist nur innerhalb des Blockes sichtbar, nicht jedoch außerhalb. Es sind auch einige Subroutinen eingeschlossen. Da Subroutinen jedoch immer global sind, sind sie auch von außen sichtbar und somit ausführbar. Und sie haben zusätzlich Zugriff auf die Variable $counter.
Achtung: der Block mit der Closure muß immer vor dem Code kommen, weil sonst die Zeile my $counter = 0; nicht ausgeführt würde, und somit die Variable $counter zwar deklariert, aber noch nicht initialisiert wäre, und sich use warnings; ueber einen nicht-initialisierten Wert beschweren würde, wenn das &GibMirDenCounterWert() in der Zeile 25 z.B. in der Zeile 4 schon ausgeführt würde.