9.2 数组的散列 9.2.1 数组的散列的组成 Vsftp:/root/perl/6# cat a1.pl %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); print %HoA; print " "; Vsftp:/root/perl/6# perl a1.pl simpsonsARRAY(0x1e7c580)jetsonsARRAY(0x1e7c358)flintstonesARRAY(0x1e60d48 要向散列增加另外一个数组,你可以简单地说: Vsftp:/root/perl/6# cat a1.pl %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); print %HoA; print " "; $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ]; print %HoA; print " "; Vsftp:/root/perl/6# perl a1.pl simpsonsARRAY(0x22fc628)jetsonsARRAY(0x22fc358)flintstonesARRAY(0x22e0d48) simpsonsARRAY(0x22fc628)teletubbiesARRAY(0x22fc340)jetsonsARRAY(0x22fc358)flintstonesARRAY(0x22e0d48) 9.2.2 生成数组的散列 下面是填充一个数组的散列的技巧,从下面格式的文件中读取出来: Vsftp:/root/perl/6# cat aa flintsotnes: fred barney wilma dino jetsons: george jane elroy simpsons: homer marge bart Vsftp:/root/perl/6# cat a2.pl open (A,aa); while (<A>){ my @arr=(); my @arr= (split(/:/,$_))[1]; my $str= (split(/:/,$_))[0]; $HoA{$str}=[@arr]; }; print %HoA; print " "; Vsftp:/root/perl/6# perl a2.pl simpsonsARRAY(0x1c05628)jetsonsARRAY(0x1be9b98)flintsotnesARRAY(0x1be9d48) Vsftp:/root/perl/6# cat a2.pl open (A,aa); while (<A>){ my @arr=(); my @arr= (split(/:/,$_))[1]; my $str= (split(/:/,$_))[0]; $HoA{$str}=[@arr]; }; print %HoA; print " "; print @{$HoA{flintsotnes}}; print " "; Vsftp:/root/perl/6# perl a2.pl simpsonsARRAY(0x2610670)jetsonsARRAY(0x25f4b98)flintsotnesARRAY(0x25f4d48) fred barney wilma dino Vsftp:/root/perl/6# cat a2.pl open (A,aa); while (<A>){ my @arr=(); my @arr= (split(/:/,$_))[1]; my $str= (split(/:/,$_))[0]; $HoA{$str}=[@arr]; }; print %HoA; print " "; print @{$HoA{flintsotnes}}; print " "; Vsftp:/root/perl/6# cat a2.pl open (A,aa); while (<A>){ my @arr=(); my @arr= (split(/:/,$_))[1]; my $str= (split(/:/,$_))[0]; $HoA{$str}=[@arr]; }; print %HoA; print " "; print @{$HoA{flintsotnes}}; print " "; for $group ( "simpsons", "jetsons", "flintstones" ) { @members = get_family($group); $HoA{$group} = [ @members ]; }; print %HoA; print " "; print @{$HoA{flintstones}}; print " "; sub get_family(){ my $a=shift; return @arr=("$a".11,"$a".22,"$a".33); }; Vsftp:/root/perl/6# perl a2.pl simpsonsARRAY(0xa3b3c0)jetsonsARRAY(0xa13b98)flintsotnesARRAY(0xa13d48) fred barney wilma dino simpsonsARRAY(0xa3b5d0)flintstonesARRAY(0xa3b6c0)jetsonsARRAY(0xa3b690)flintsotnesARRAY(0xa13d48) flintstones11flintstones22flintstones33 9.2.3 访问和打印数组的散列 你可以用下面的方法设置某一个数组的第一个元素: Vsftp:/root/perl/6# perl a1.pl 11111111111111111 fred Vsftp:/root/perl/6# cat a1.pl %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ]; print "11111111111111111 "; print $HoA{flintstones}[0]; print " "; Vsftp:/root/perl/6# perl a1.pl 11111111111111111 fred Vsftp:/root/perl/6# cat a1.pl %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ]; print "11111111111111111 "; print @{$HoA{flintstones}}; print " "; $HoA{flintstones}[0] = "Fred"; print @{$HoA{flintstones}}; print " "; Vsftp:/root/perl/6# perl a1.pl 11111111111111111 fredbarney Fredbarney 打印所有这些数组,方法是遍历散列的所有键值: %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ]; print %HoA; print " "; for $family ( keys %HoA ){ print "$family: @{ $HoA{$family} } "; } ~ Vsftp:/root/perl/6# cat a1.pl %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); $HoA{teletubbies} = [ "tinky winky", "dipsy", "laa-laa", "po" ]; print %HoA; print " "; for $family ( keys %HoA ) { print "$family: "; for $i ( 0 .. $#{ $HoA{$family} }) { print " $i = $HoA{$family}[$i]"; } print " "; } print %HoA; print " "; Vsftp:/root/perl/6# perl a1.pl simpsonsARRAY(0xde4a68)teletubbiesARRAY(0xdd9340)jetsonsARRAY(0xdd9358)flintstonesARRAY(0xdbdd48) simpsons: 0 = homer 1 = marge 2 = bart teletubbies: 0 = tinky winky 1 = dipsy 2 = laa-laa 3 = po jetsons: 0 = george 1 = jane 2 = elroy flintstones: 0 = fred 1 = barney simpsonsARRAY(0xde4a68)teletubbiesARRAY(0xdd9340)jetsonsARRAY(0xdd9358)flintstonesARRAY(0xdbdd48)