Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
*foo{THING}-Syntaxref()grepmapData::Dumper
Data::DumperTie::RefHash
use strict 'refs'; # Verbiete symbolische Referenzen
no strict 'refs'; # Erlaube symrefs wieder
# Der Backslash-Operator erzeugt benannte Referenzen
\$scalvar, \@array, \%hash, \&function, \*FH, \substr(), \$ptr, \\var
# Die *foo{THING}-Syntax, anstelle des Backslash-Operators
*foo{SCALAR}, *foo{ARRAY}, *foo{HASH}, *foo{CODE}, *foo{IO}, *foo{GLOB}
# Referenzen auf anonyme Strukturen sind auch möglich
$listptr = [ $var1, "hello", @alist ];
$hashptr = { I => 1, II => 2, III => 3, IV => 4, V => 5 };
$funcptr = sub { print "hello, this is an anon. subroutine\n" };
# Dereferenzierung von Zeigern mit der Blocknotation
${$s_ptr} = "new value"; # Verändert, worauf $s_ptr zeigte
push(@{$a_ptr}, @morevalues); # Ergänzt eine Liste
foreach my $key ( keys %{$h_ptr} ) { ... }
${ gimme_a_ptr($something) } = "this is new"; # Ausdrücke okay
# Dereferenzierung von Zeigern mit dem Pfeiloperator
$a_ptr->[42] = "The answer to all questions";
print $h_ptr->{'PHONE'}; # 555-2311
@resultlist = $f_ptr->($arg1, $arg2, $arg3);
# Typ einer Referenz erkennen
$type = ref($ptr); # SCALAR, ARRAY, HASH, CODE, GLOB, REF, LVALUE
# oder Name der Klasse des Objekts $ptr
# oder falsch, falls $ptr keine Referenz war
# Komplexe Strukturen
@LoL = ( [ $x11,$x12,$x13 ], [ $x21,$x22,$x23 ], [ $x31,$x32,$x33 ] );
$pivot = $LoL[1][1];
$prof->{'NAME'} = $name; $prof->{'PHONE'} = $phone;
use Data::Dumper; print Dumper(\@LoL, \$prof);
# Die Schwartzsche Transformation
@sorted = map { $_->[0] } # 4. Extrahieren
sort { $a->[1] <=> $b->[1] } # 3. Sortierung
map { [ $_, slowfunc($_) ] } # 2. Werte vorberechnen
@nonsorted; # 1. Was sortiert wird
# Schlüssel können normalerweise keine Referenzen sein
use Tie::RefHash;
tie %h, 'Tie::RefHash' or die "can't tie: $!\n";
$h{ $ptr } = "some value";
$h{ [ "this", "is", "an", "anonymous", "list" ] } = time();
@refs = keys %h;
# Kopieren komplexer Datenstrukturen
@dstLOL = @oldLoL; # VORSICHT: Shallow Copy
use Storable qw(dclone);
@copyLoL = dclone(\@oldLoL); # Deep Copy
# Symbolische Referenzen
$var = "some value"; $vname = 'var'; ${$vname} = "other value";
@ary = ( .... ); $vname = 'ary'; push(@{$vname}, "more");
sub fun { ... }; $vname = 'fun'; $vname->(); $SIG{'INT'} = $vname;
# Eine sinnvolle Anwendung symbolischer Referenzen
if ($arg =~ /-D(\w+)=(\w+)/) { ${$1} = $2 }
refs-display.pl |
Zeigt "nackte" Referenzen |
prompter.pl |
Übergabe von Referenzen auf Filehandles |
opener.pl |
Wrapper um die open()-Funktion |
ref-lvalue.pl |
Undokumentierte LVALUE-Zeiger |
matrix.c |
Matrix-Beispiel in C: Variable Zeilengrößen |
matrix.cc |
Matrix-Beispiel in C++: Variable Zeilengrößen |
matrix-dyn.pl |
Dynamisches Einlesen von Matrizenwerten |
flat-list.pl |
Verschachtelung bei Listen nicht direkt möglich |
lol.pl |
Demo der list of list |
loh.pl |
Liste von Hashes |
hol.pl |
Hash von Listen: Mehrere Werte pro Schlüssel = Multihash |
hoh.pl |
Hash von Hashes: Dünn besetzte Matrizen |
cmplx-print0.pl |
Versuch, komplexe Datenstrukturen anzuzeigen |
cmplx-print1.pl |
Komplexe Datenstrukturen anzeigen: Selbstgemacht |
cmplx-print2.pl |
Komplexe Datenstrukturen mit Data::Dumper |
bintree-traverse.pl |
Traversiert einen binären Baum |
graph-traverse.pl |
Traversiert einen zusammenhängenden Graphen |
obj-closures.pl |
Objekte mit Closures |
sort-ip.pl |
Sortiert IP-Adressen in Dotted-Quad-Notation |
multihash-flatfile.pl |
Multihashes in einer flachen Textdatei speichern |
tie-refhash.pl |
Referenzen als Schlüssel in Hashes |
copy-shallow.pl |
Shallow Copy: Oberflächenkopie verschachtelter Strukturen |
copy-deep.pl |
Deep Copy: Tiefe rekursive Kopie verschachtelter Strukturen |
symrefs-example.pl |
Beispiele symbolischer Referenzen |
symrefs-hairy.pl |
Symbolische Referenzen können haarig sein |
\my
@myanons = map { \my $anonvar } 0 .. 10; # my ist wichtig!
@myanons nun elf Referenzen auf skalare Werte. Um darauf zuzugreifen, müssen diese Referenzen erst dereferenziert werden:
$myanons->[5] = "new value"; print $myanons->[3];
@myanons weiterleben, bleibt auch der zugehörige Speicherplatz erhalten, da ihre Referenzzähler noch nicht auf 0 gefallen sind.my ist hier wesentlich um mehrere Variablen zu erzeugen. my-Variablen haben normalerweise nur Gültigkeit innerhalb des sie umschließenden Blocks, hier innerhalb des map-Ausdrucks. Ihre Adresse wird jedoch mit Hilfe des Adreßoperators \ in \my $anonvar aus dem map-Ausdruck heraus gerettet. Würde my fehlen, z.B. in map { \$anonvar } 0 .. 10, so würde eine globale Variable $anonvar erzeugt, und dann elfmal dieselbe Referenz darauf zurückgeliefert. Das ist nicht das, was wir hier wollten. (1999/11/19, nach einer Frage von Joachim Backes)
In Vorbereitung
opener.pl:
my $fh = Open("< /etc/group");
while (<$fh>) { print; }
close(*{$fh});
while (<${$fh}>) { print; }
$fh eine Referenz auf ein Filehandle ist, und im Diamond-Operator das Filehandle selber stehen muß. (2000/11/26), anonymous.$fh_ptr = \FH; # FALSCH, FH ist Bareword, nicht Handle.
*FH genommen:
$tg_ptr = \*FH;
*FH einen generischen Eintrag in der aktuellen Symboltabelle. *FH steht sowohl für $FH, @FH, %FH als auch &FH und, last but not least, dem Filehandle FH.
$skalar = ${$tg_ptr};
@array = @{$tg_ptr};
%hash = %{$tg_ptr};
&{$tg_ptr}($arg1, $arg2);
open($tg_ptr, "< myfile");
unbekannter_praefix{$tg_ptr}
# oder gar
{$tg_ptr}
zu sagen, um an den Handle zu kommen.Z.Zt. keine Fehler bekannt.
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:55:45 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|