Leser: 1
|< 1 2 3 4 >| | 33 Einträge, 4 Seiten |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
# find mit Closure
find(sub {print if /\.pl$/;},'.');
# find mit Callback
find(\&wanted,'.');
sub wanted {
print if /\.pl$/;
}
void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
{ my $a; sub inc { ++$a } }
QuoteStrat, 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 3301: #! /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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub newprint {
my $x = shift;
return sub {
my $y = shift;
print "$x, $y!\n";
}
}
$h = newprint('Howdy');
$g = newprint('Greetings');
# ...
&$h('world'); # Ausgabe: Howdy, world!
&$g('earthlings'); # Ausgabe: Greetings, earthlings!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub newprint {
my $x = shift;
return sub {
my $y = shift;
print "$x, $y!\n";
}
}
$h = newprint('Howdy');
$g = newprint('Greetings');
# ...
&$h('world'); # Ausgabe: Howdy, world!
&$g('earthlings'); # Ausgabe: Greetings, earthlings!
|< 1 2 3 4 >| | 33 Einträge, 4 Seiten |