./perl/gimmicks.txt
download original
do { } kann benutzt werden, um das Ergebnis eines Blocks als Ausdruck zu benutzen (wie `eval'?)
Quasi wie eine parameterloser Closure, die sofort automatisch ausgeführt wird.
$i=10; print join("\n", do { @res=(1); for (1..$i) { push @res, $res[$_-1] * $_; }; @res })
Ausgabe:
1
1
2
6
24
120
720
5040
40320
362880
3628800
Hinw.: "return" in einem "do" normalerweise nicht verwenden, da (Doku):
return EXPR
return Returns from a subroutine, 'eval', or 'do FILE'
with the value given in EXPR.
-----
Normale Closures kriegt man mit anonymen subs:
DB<349> x $fn2= sub($) { 5*shift; }
0 CODE(0x867a6e4)
-> &main::__ANON__[(eval 379)[/usr/local/lib/perl5/5.6.0/perl5db.pl:1510]:2] in (eval 379)[/usr/local/lib/perl5/5.6.0/perl5db.pl:1510]:2-2
DB<350> x $fn2->(8)
0 40
DB<351> x $fn2->(8,9)
0 40
(=> "($)" wurde nicht beachtet??
DB<352>
aber irgendwie doch nicht:
DB<352> x map $fn2 (4,5,6,7)
empty array
DB<353> x map sub($) { 5*shift; } (4,5,6,7)
syntax error at (eval 383)[/usr/local/lib/perl5/5.6.0/perl5db.pl:1510] line 2, near "} ("
DB<354>
DB<354> x map { 3*$_ } (4,5,6,7)
0 12
1 15
2 18
3 21
DB<355> x map { $fn2->($_) } (4,5,6,7)
0 20
1 25
2 30
3 35
DB<356>
(OK, map hat wohl spezielle Syntax (siehe Doku))
-----
"my" erzeugt Variablen mit lexikalischer Bindung, ohne "my" kriegt man
dynamische Bindung (vollqual. Name: <akt. Modulname>::<Variablenname>)
-----
"Typeglobbing" -- Keys (Namen) in der Symboltabelle direkt umsetzen
z.B.
DB<8> $a=42
DB<9> x $a
0 42
DB<10> *b=*a
DB<11> x $b
0 42
DB<12> $a++
DB<13> x $b
0 43
DB<14>
Funktioniert nicht nur mit Skalaren, sondern mit allen Arten von
Objekten (auch subs, Packages usw.)
-----
Modul "Memoize" -- Funktionsergebnisse cachen. Cache ist eine
Hashtabelle, kann ggf. auf ein ext. File ge-tie()-d (s.u.) werden
Siehe Manpage.
-----
tie() -- eingeb. Funktion, um für bel. Variablen das "Backend"
(Implementation) selbst programmieren zu können
Bsp. aus man perlfunc:
use NDBM_File;
tie(%HIST, 'NDBM_File', '/usr/lib/news/history', 1, 0);
while (($key,$val) = each %HIST) {
print $key, ' = ', unpack('L',$val), "\n";
}
untie(%HIST);
Modul 'NDBM_File' implementiert %HIST (setzt dazu standardisiertes
Protokoll mit best. Callback-Funktionen um, siehe man perlfunc, man
perltie)
-----
local $/ = undef
$/ im akt. Stackframe und alle aufgerufenen Frames (dynamisches
Scoping) umdefinieren. Alte Belegung wird automatisch restauriert,
wenn dieses Frame zerstoert wird (durch Raussprung)
-----
Verschachtelte capture buffers in Reg. Audrücken:
Bsp.:
DB<20> x "tv_20011001.xml.gz;107024" =~ /^(tv_(\d{8})\.xml\.gz);(\d+)$/
0 'tv_20011001.xml.gz'
1 20011001
2 107024
DB<21>
-----
# Prototype declarations
sub chunk( $$ );
-----
(shallow-) Kopie einer Liste erzeugen, Referenz darauf zurückgeben
[ @list ]
-----
Slices
@days # ($days[0], $days[1],... $days[n])
@days[3,4,5] # same as ($days[3],$days[4],$days[5])
@days{'a','c'} # same as ($days{'a'},$days{'c'})
Indizierung von hinten
$arr[-1] -- letztes Element
$arr[-2] -- vorletztes Element
usw.
-----
Regexps: "Multiple matches"(?)
DB<228> $_='23:66ff27djd93j44je7edj43893m3m3ddkd83m3'
DB<229> x /(\d+)/g
0 23
1 66
2 27
3 93
4 44
5 7
6 43893
7 3
8 3
9 83
10 3
DB<230>
------
Modul module.pm unconditinally neuladen im interaktiven Modus (und
auch sonst):
do "module.pm"; print "$@";
(das print gibt die eventuelle Fehlermeldung aus)
back to perl
(C) 1998-2017 Olaf Klischat <olaf.klischat@gmail.com>