Thread Callbacks und Closures?: Kann mal einer was dazu erzählen. (32 answers)
Opened by Ronnie at 2003-11-23 22:15

Strat
 2003-11-24 01:28
#72632 #72632
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
hier ein ausschnitt aus meiner doku fuer "fortgeschrittene Perl-Programmierung":
Quote
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
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
01: #! /usr/bin/perl
02: use warnings;
03: use strict;
04: 
05: # ============================================================
06: { # Beginn der Closure
07:     my $counter = 0;
08:     # ------------------------------------------------------------
09:     sub ZaehleHoch {
10:         $counter++;
11:     } # ZaehleHoch
12:     # ------------------------------------------------------------
13:     sub ZaehleRunter {
14:         $counter--;
15:     } # ZaehleRunter
16:     # ------------------------------------------------------------
17:     sub GibMirDenCounterWert {
18:         return $counter;
19:     } # GibMirDenCounterWert
20:     # ------------------------------------------------------------
21: 
22: } # Ende der Closure
23: # ============================================================
24: 
25: print &GibMirDenCounterWert(), "\n";
26: for my $i (1..20) {
27:     &ZaehleHoch();
28: } # for
29: print &GibMirDenCounterWert(), "\n";
30: for my $i (4..9) {
31:     &ZaehleRunter();
32: } # for
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.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread Callbacks und Closures?: Kann mal einer was dazu erzählen.