代码范例下面给出了一些简短的代码范例,用于说明对各种数据结构的操作。注释很少,将来或许会有吧。ARRAYS OF ARRAYSDeclaration of an ARRAY OF ARRAYS @AoA = (        [ "fred", "barney" ],        [ "george", "jane", "elroy" ],        [ "homer", "marge", "bart" ],      );Generation of an ARRAY OF ARRAYS # reading from file while ( ) {     push @AoA, [ split ]; } # calling a function for $i ( 1 .. 10 ) {     $AoA[$i] = [ somefunc($i) ]; } # using temp vars for $i ( 1 .. 10 ) {     @tmp = somefunc($i);     $AoA[$i] = [ @tmp ]; } # add to an existing row push @{ $AoA[0] }, "wilma", "betty";Access and Printing of an ARRAY OFARRAYS # one element $AoA[0][0] = "Fred"; # another element $AoA[1][1] =~ s/(\w)/\u$1/; # print the whole thing with refs for $aref ( @AoA ) {     print "\t [ @$aref ],\n"; } # print the whole thing with indices for $i ( 0 .. $#AoA ) {     print "\t [ @{$AoA[$i]} ],\n"; } # print the whole thing one at a time for $i ( 0 .. $#AoA ) {     for $j ( 0 .. $#{ $AoA[$i] } ) {         print "elt $i $j is $AoA[$i][$j]\n";     } }HASHES OF ARRAYSDeclaration of a HASH OF ARRAYS %HoA = (        flintstones        => [ "fred", "barney" ],        jetsons            => [ "george", "jane", "elroy" ],        simpsons           => [ "homer", "marge", "bart" ],      );Generation of a HASH OF ARRAYS # reading from file # flintstones: fred barney wilma dino while ( ) {     next unless s/^(.*?):\s*//;     $HoA{$1} = [ split ]; } # reading from file; more temps # flintstones: fred barney wilma dino while ( $line = ) {     ($who, $rest) = split /:\s*/, $line, 2;     @fields = split ' ', $rest;     $HoA{$who} = [ @fields ]; } # calling a function that returns a list for $group ( "simpsons", "jetsons", "flintstones" ) {     $HoA{$group} = [ get_family($group) ]; } # likewise, but using temps for $group ( "simpsons", "jetsons", "flintstones" ) {     @members = get_family($group);     $HoA{$group} = [ @members ]; } # append new members to an existing family push @{ $HoA{"flintstones"} }, "wilma", "betty";Access and Printing of a HASH OFARRAYS # one element $HoA{flintstones}[0] = "Fred"; # another element $HoA{simpsons}[1] =~ s/(\w)/\u$1/; # print the whole thing foreach $family ( keys %HoA ) {     print "$family: @{ $HoA{$family} }\n" } # print the whole thing with indices foreach $family ( keys %HoA ) {     print "family: ";     foreach $i ( 0 .. $#{ $HoA{$family} } ) {         print " $i = $HoA{$family}[$i]";     }     print "\n"; } # print the whole thing sorted by number of members foreach $family ( sort { @{$HoA{$b}} @{$HoA{$a}} } keys %HoA ) {     print "$family: @{ $HoA{$family} }\n" } # print the whole thing sorted by number of members and name foreach $family ( sort {                            @{$HoA{$b}} @{$HoA{$a}}                                        ||                                    $a cmp $b            } keys %HoA ) {     print "$family: ", join(", ", sort @{ $HoA{$family} }), "\n"; }ARRAYS OF HASHESDeclaration of an ARRAY OF HASHES @AoH = (        {            Lead     => "fred",            Friend   => "barney",        },        {            Lead     => "george",            Wife     => "jane",            Son      => "elroy",        },        {            Lead     => "homer",            Wife     => "marge",            Son      => "bart",        }  );Generation of an ARRAY OF HASHES # reading from file # format: LEAD=fred FRIEND=barney while ( ) {     $rec = {};     for $field ( split ) {         ($key, $value) = split /=/, $field;         $rec->{$key} = $value;     }     push @AoH, $rec; } # reading from file # format: LEAD=fred FRIEND=barney # no temp while ( ) {     push @AoH, { split /[\s+=]/ }; } # calling a function  that returns a key/value pair list, like # "lead","fred","daughter","pebbles" while ( %fields = getnextpairset() ) {     push @AoH, { %fields }; } # likewise, but using no temp vars while () {     push @AoH, { parsepairs($_) }; } # add key/value to an element $AoH[0]{pet} = "dino"; $AoH[2]{pet} = "santa's little helper";Access and Printing of an ARRAY OFHASHES # one element $AoH[0]{lead} = "fred"; # another element $AoH[1]{lead} =~ s/(\w)/\u$1/; # print the whole thing with refs for $href ( @AoH ) {     print "{ ";     for $role ( keys %$href ) {         print "$role=$href->{$role} ";     }     print "}\n"; } # print the whole thing with indices for $i ( 0 .. $#AoH ) {     print "$i is { ";     for $role ( keys %{ $AoH[$i] } ) {         print "$role=$AoH[$i]{$role} ";     }     print "}\n"; } # print the whole thing one at a time for $i ( 0 .. $#AoH ) {     for $role ( keys %{ $AoH[$i] } ) {         print "elt $i $role is $AoH[$i]{$role}\n";     } }HASHES OF HASHESDeclaration of a HASH OF HASHES %HoH = (        flintstones => {                lead      => "fred",                pal       => "barney",        },        jetsons     => {                lead      => "george",                wife      => "jane",                "his boy" => "elroy",        },        simpsons    => {                lead      => "homer",                wife      => "marge",                kid       => "bart",        }, );Generation of a HASH OF HASHES # reading from file # flintstones: lead=fred pal=barney wife=wilma pet=dino while ( ) {     next unless s/^(.*?):\s*//;     $who = $1;     for $field ( split ) {         ($key, $value) = split /=/, $field;         $HoH{$who}{$key} = $value;     } # reading from file; more temps while ( ) {     next unless s/^(.*?):\s*//;     $who = $1;     $rec = {};     $HoH{$who} = $rec;     for $field ( split ) {         ($key, $value) = split /=/, $field;         $rec->{$key} = $value;     } } # calling a function  that returns a key,value hash for $group ( "simpsons", "jetsons", "flintstones" ) {     $HoH{$group} = { get_family($group) }; } # likewise, but using temps for $group ( "simpsons", "jetsons", "flintstones" ) {     %members = get_family($group);     $HoH{$group} = { %members }; } # append new members to an existing family %new_folks = (     wife => "wilma",     pet  => "dino", ); for $what (keys %new_folks) {     $HoH{flintstones}{$what} = $new_folks{$what}; }Access and Printing of a HASH OFHASHES # one element $HoH{flintstones}{wife} = "wilma"; # another element $HoH{simpsons}{lead} =~ s/(\w)/\u$1/; # print the whole thing foreach $family ( keys %HoH ) {     print "$family: { ";     for $role ( keys %{ $HoH{$family} } ) {         print "$role=$HoH{$family}{$role} ";     }     print "}\n"; } # print the whole thing  somewhat sorted foreach $family ( sort keys %HoH ) {     print "$family: { ";     for $role ( sort keys %{ $HoH{$family} } ) {         print "$role=$HoH{$family}{$role} ";     }     print "}\n"; } # print the whole thing sorted by number of members foreach $family ( sort { keys %{$HoH{$b}} keys %{$HoH{$a}} } keys %HoH ) {     print "$family: { ";     for $role ( sort keys %{ $HoH{$family} } ) {         print "$role=$HoH{$family}{$role} ";     }     print "}\n"; } # establish a sort order (rank) for each role $i = 0; for ( qw(lead wife son daughter pal pet) ) { $rank{$_} = ++$i } # now print the whole thing sorted by number of members foreach $family ( sort { keys %{ $HoH{$b} } keys %{ $HoH{$a} } } keys %HoH ) {     print "$family: { ";     # and print these according to rank order     for $role ( sort { $rank{$a} $rank{$b} }  keys %{ $HoH{$family} } ) {         print "$role=$HoH{$family}{$role} ";     }     print "}\n"; }MOREELABORATE RECORDSDeclaration of MORE ELABORATERECORDSHere's a sample showing how to create and use a record whosefields are of many different sorts:     $rec = {         TEXT      => $string,         SEQUENCE  => [ @old_values ],         LOOKUP    => { %some_table },         THATCODE  => \&some_function,         THISCODE  => sub { $_[0] ** $_[1] },         HANDLE    => \*STDOUT,     };     print $rec->{TEXT};     print $rec->{SEQUENCE}[0];     $last = pop @ { $rec->{SEQUENCE} };     print $rec->{LOOKUP}{"key"};     ($first_k, $first_v) = each %{ $rec->{LOOKUP} };     $answer = $rec->{THATCODE}->($arg);     $answer = $rec->{THISCODE}->($arg1, $arg2);     # careful of extra block braces on fh ref     print { $rec->{HANDLE} } "a string\n";     use FileHandle;     $rec->{HANDLE}->autoflush(1);     $rec->{HANDLE}->print(" a string\n");Declaration of a HASH OF COMPLEXRECORDS     %TV = (        flintstones => {            series   => "flintstones",            nights   => [ qw(monday thursday friday) ],            members  => [                { name => "fred",    role => "lead", age  => 36, },                { name => "wilma",   role => "wife", age  => 31, },                { name => "pebbles", role => "kid",  age  =>  4, },            ],        },        jetsons     => {            series   => "jetsons",            nights   => [ qw(wednesday saturday) ],            members  => [                { name => "george",  role => "lead", age  => 41, },                { name => "jane",    role => "wife", age  => 39, },                { name => "elroy",   role => "kid",  age  =>  9, },            ],         },        simpsons    => {            series   => "simpsons",            nights   => [ qw(monday) ],            members  => [                { name => "homer", role => "lead", age  => 34, },                { name => "marge", role => "wife", age => 37, },                { name => "bart",  role => "kid",  age  =>  11, },            ],         },              );Generation of a HASH OF COMPLEXRECORDS     # reading from file     # this is most easily done by having the file itself be     # in the raw data format as shown above.  perl is happy     # to parse complex data structures if declared as data, so     # sometimes it's easiest to do that     # here's a piece by piece build up     $rec = {};     $rec->{series} = "flintstones";     $rec->{nights} = [ find_days() ];     @members = ();     # assume this file in field=value syntax     while () {         %fields = split /[\s=]+/;         push @members, { %fields };     }     $rec->{members} = [ @members ];     # now remember the whole thing     $TV{ $rec->{series} } = $rec;     ###########################################################     # now, you might want to make interesting extra fields that     # include pointers back into the same data structure so if     # change one piece, it changes everywhere, like for example     # if you wanted a {kids} field that was a reference     # to an array of the kids' records without having duplicate     # records and thus update problems.     ###########################################################     foreach $family (keys %TV) {         $rec = $TV{$family}; # temp pointer         @kids = ();         for $person ( @{ $rec->{members} } ) {             if ($person->{role} =~ /kid|son|daughter/) {                 push @kids, $person;             }         }         # REMEMBER: $rec and $TV{$family} point to same data!!         $rec->{kids} = [ @kids ];     }     # you copied the array, but the array itself contains pointers     # to uncopied objects. this means that if you make bart get     # older via     $TV{simpsons}{kids}[0]{age}++;     # then this would also change in     print $TV{simpsons}{members}[2]{age};     # because $TV{simpsons}{kids}[0] and $TV{simpsons}{members}[2]     # both point to the same underlying anonymous hash table     # print the whole thing     foreach $family ( keys %TV ) {         print "the $family";         print " is on during @{ $TV{$family}{nights} }\n";         print "its members are:\n";         for $who ( @{ $TV{$family}{members} } ) {             print " $who->{name} ($who->{role}), age $who->{age}\n";         }         print "it turns out that $TV{$family}{lead} has ";         print scalar ( @{ $TV{$family}{kids} } ), " kids named ";         print join (", ", map { $_->{name} } @{ $TV{$family}{kids} } );         print "\n";     } 与数据库的关联很难将一个多层的数据结构与dbm文件进行关联,如散列的散列。首先,除了GDBM和BerkeleyDB外,都有文件大小的限制。此外,在磁盘上如何表示引用?MLDBM是一个尝试性的模块,部分的解决了这些问题。可以到CPAN网站上去获取MLDBM模块的源码,CPAN和模块的相关信息在perlmodlibmanpage中有介绍。 参考perlref(1), perllol(1), perldata(1), perlobj(1) 作者Tom Christiansen tchrist@perl.com>Last update: Wed Oct 23 04:57:50 MET DST 1996
09-26 14:29