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: ::) ----- "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)