第9章 数据结构

9.1.1 创建和访问一个两维数组

[root@wx03 4]# cat a1.pl 
@Aoa = (
["fred", "barney" ],
["george", "jane", "elroy" ],
["homer", "marge", "bart" ],
);
print $Aoa[0]->[1];
print "\n";
[root@wx03 4]# perl a1.pl 
barney


$Aoa[0]->[1]; [0]表示第一个元素,->[1]表示数组引用的第2个元素

请注意 $array[3] 和 $array->[3] 是不一样的。第一个东西讲的是 @array 里的第四个元素, 而第二个东西讲  
的是一个保存在 $array 里的数组(可能是匿名的数组)引用的第四个元素。

[root@wx03 4]# cat a2.pl 
$ref_to_AoA = [
[ "fred", "barney674128462", "pebbles", "bamm bamm", "dino", ],
[ "homer", "bart", "marge", "maggie", ],
[ "george", "jane", "elroy", "judy", ],
];

print $ref_to_AoA->[0]->[1];
print "\n";
[root@wx03 4]# perl a2.pl 
barney674128462

请记住在每一对相邻的花括弧或方括弧之间有一个隐含的 ->。因此下面两行:

[root@wx03 4]# cat tmp.out 
a b56757 c 
e f g
o p q
r s t

[root@wx03 4]# cat a3.pl 
open (LOG ,"<","tmp.out");  
       while (<LOG>) { 
       @tmp = split;
push @AoA,[@tmp];
};
use Data::Dumper;
$str=Dumper(@AoA);

print @AoA;
print "\n"; 
print  $str;
print "\n";
print $AoA[0][1];
print "\n";



[root@wx03 4]# perl a3.pl 
ARRAY(0xf12338)ARRAY(0xf12410)ARRAY(0xf12cf8)ARRAY(0xf20088)ARRAY(0xefe160)
$VAR1 = [
          'a',
          'b56757',
          'c'
        ];
$VAR2 = [
          'e',
          'f',
          'g'
        ];
$VAR3 = [
          'o',
          'p',
          'q'
        ];
$VAR4 = [
          'r',
          's',
          't'
        ];
$VAR5 = [];

b56757


[root@wx03 4]# cat a4.pl 
sub func{
  $a=shift;
  $b=shift;
return $a + $b;
};

  



for $x (0..3){ # 对每一行...
for $y (0..3) { # 对每一列...
$AoA[$x][$y] = func($x, $y); # ...设置调用
}
};
print @AoA;
use Data::Dumper;
$str=Dumper(@AoA);
print "\$str is $str\n";
[root@wx03 4]# perl a4.pl 
ARRAY(0xec3368)ARRAY(0xec3488)ARRAY(0xed0158)ARRAY(0xee4d10)$str is $VAR1 = [
          0,
          1,
          2,
          3
        ];
$VAR2 = [
          1,
          2,
          3,
          4
        ];
$VAR3 = [
          2,
          3,
          4,
          5
        ];
$VAR4 = [
          3,
          4,
          5,
          6
        ];




for $i (1..10) {
@array = ($i,$i+1,$i+2);
$AoA[$i] = [ @array ]; 
};
print @AoA;
~            

$AoA[$i] = [ @array ];  ##数组的每个元素是一个数组引用



[root@wx03 4]# cat a5.pl 
for $i (1..3) {
@array = ($i,$i+1,$i+2);
$AoA[$i] = [ @array ]; # 错误!
};
print @AoA;
use Data::Dumper;
$str=Dumper(@AoA);
print "\$str is $str\n";
[root@wx03 4]# perl a5.pl 
ARRAY(0xe7f368)ARRAY(0xe7f4a0)ARRAY(0xe8d0b8)$str is $VAR1 = undef;
$VAR2 = [
          1,
          2,
          3
        ];
$VAR3 = [
          2,
          3,
          4
        ];
$VAR4 = [
          3,
          4,
          5
        ];


9.2 数组的散列


[root@wx03 4]# cat a6.pl 
%HoA = (
flintstones => [ "fred", "barney" ],
jetsons => [ "george", "jane", "elroy" ],
simpsons => [ "homer", "marge", "bart" ],
);
print $HoA{flintstones}->[1];
print "\n";
##添加元素
#
$HoA{test}=['a','b'];
print %HoA;
print "\n";

[root@wx03 4]# perl a6.pl 
barney
flintstonesARRAY(0xfb0160)jetsonsARRAY(0xfc4368)simpsonsARRAY(0xfc44b8)testARRAY(0xfc4338)



[root@wx03 4]# cat a7.pl 
open (LOG ,"<","t1.out");
while ( $line = <LOG> ) {
($who, $rest) = split /:\S*/, $line, 2;
print "\$who is $who\n";
print "\$rest is $rest\n";
@fields = split /\s+/, $rest;
$HoA{$who} = [ @fields ];
};
print %HoA;
print "\n";



[root@wx03 4]# cat a7.pl 
open (LOG ,"<","t1.out");
@fields=();
while ( $line = <LOG> ) {
($who, $rest) = split /:\S*/, $line, 2;
print "\$who is $who\n";
print "\$rest is $rest\n";
@fields = split /#/, $rest;
print "\@fields is @fields\n";
$HoA{$who} = [ @fields ];
};
print %HoA;
print "\n";

use Data::Dumper;
$str=Dumper(%HoA);
print "\$str is $str\n";

print $HoA{flintsotnes}->[1];
print "\n";
[root@wx03 4]# perl a7.pl 
$who is flintsotnes
$rest is  fred#barney#wilma#dino

@fields is  fred barney wilma dino

$who is jetsons
$rest is  george#jane#elroy

@fields is  george jane elroy

$who is simpsons
$rest is  homer#marge#bart

@fields is  homer marge bart

simpsonsARRAY(0x2297668)flintsotnesARRAY(0x228a368)jetsonsARRAY(0x228a338)
$str is $VAR1 = 'simpsons';
$VAR2 = [
          ' homer',
          'marge',
          'bart
'
        ];
$VAR3 = 'flintsotnes';
$VAR4 = [
          ' fred',
          'barney',
          'wilma',
          'dino
'
        ];
$VAR5 = 'jetsons';
$VAR6 = [
          ' george',
          'jane',
          'elroy
'
        ];

barney


[root@wx03 4]# perl a7.pl 
$who is flintsotnes
$rest is  fred barney wilma dino

$who is jetsons
$rest is  george jane elroy

$who is simpsons
$rest is  homer marge bart

flintsotnesARRAY(0x1c0a350)simpsonsARRAY(0x1c17d50)jetsonsARRAY(0x1c0a368)

散列的数组:

[root@wx03 4]# cat a8.pl 
@AoH = (
{
husband => "barney",
wife => "betty",
son => "bamm bamm",
},
{
husband => "george",
wife => "jane",
son => "elroy",
},
{
husband => "homer",
wife => "marge",
son => "bart",
},
);
print $AoH[0]->{wife};
print "\n";
[root@wx03 4]# perl a8.pl 
betty


生产散列的数组:
[root@wx03 4]# cat t1.pl 
open (LOG ,"<","t2.out");
while (<LOG>) {
$rec = {};
for $field ( split ) {
($key, $value) = split /=/, $field;
$rec->{$key} = $value;
}
push @AoH, $rec;
}
print @AoH;
print "\n";
use Data::Dumper;
$str=Dumper(@AoH);
print "\$str is $str\n";
[root@wx03 4]# cat t2.out 
husband=fred 
friend=barney
[root@wx03 4]# perl t1.pl 
HASH(0x1e82160)HASH(0x1e96338)
$str is $VAR1 = {
          'husband' => 'fred'
        };
$VAR2 = {
          'friend' => 'barney'
        };

9.4 散列的散列:

9.4.1 构成一个散列的散列
[root@wx03 4]# cat t2.pl 
%HoH = (
flintstones => {
husband => "fred",
pal => "barney",
},
jetsons => {
husband => "george",
wife => "jane",
"his boy" => "elroy", # 键字需要引号
},
simpsons => {
husband => "homer",
wife => "marge",
kid => "bart",
},
);

print $HoH{flintstones}->{pal};
print "\n";
[root@wx03 4]# perl t2.pl 
barney

9.4.2 生成散列的散列
下面
[root@wx03 4]# cat t3.pl 
open (LOG ,"<","t3.out");
while( <LOG> ){
$who = flintstones;
for $field ( split ) {
($key, $value) = split /=/, $field;
$HoH{$who}{$key} = $value;
}
};
print %HoH;
use Data::Dumper;
$str=Dumper(%HoH);
print "\$str is $str\n";
print $HoH{flintstones}{wife};
print "\n";

[root@wx03 4]# cat t3.out 
husband=fred 
pal=barney 
wife=wilma 
pet=dino
[root@wx03 4]# perl t3.pl 
flintstonesHASH(0xb6e320)$str is $VAR1 = 'flintstones';
$VAR2 = {
          'pal' => 'barney',
          'husband' => 'fred',
          'pet' => 'dino',
          'wife' => 'wilma'
        };

wilma

9.5 函数的散列
%HoF = ( # Compose a hash of functions
exit => sub { exit },
help => \&show_help,
watch => sub { $watch = 1 },
mail => sub { mail_msg($msg) },
edit => sub { $edited++; editmsg($msg); },
delete => \&confirm_kill,
);

posted @ 2016-05-16 22:47  czcb  阅读(134)  评论(0编辑  收藏  举报