您的位置:首页 > 理论基础 > 数据结构算法

第9章 数据结构

2016-05-16 22:47 363 查看
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,
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: