用户定义数据结构:
perl 中不存在这种内建的模板功能,一种常用的方式就是使用散列表来仿真结构类型,如图2-1所示:
例子 :矩阵:
在我们讨论这个例子之前,你必须知道如果你需要的是一个好的,高效的矩阵实现的话,就应该查看一下CPAN中的PDL模块
在Perl中使用数组的数组是最为直观的一种矩阵表达方式,因为Perl不直接支持二维数组:
zjzc01:/root/hei# cat a17.pl
@matrix=([1,2,3],[4,5,6],[7,8,9]);
print @matrix;
print "
";
##将第1行,第2列的元素值改为100
print $matrix[1][2]."
";
$matrix[1][2]=100;
print $matrix[1][2]."
";
zjzc01:/root/hei# perl a17.pl
ARRAY(0x12c5d48)ARRAY(0x12e25a8)ARRAY(0x12e2620)
6
100
($line =~ /^([A-Za-z]w*)/) ###匹配字母开头
w 匹配一个字母、数字或下划线字符,相当于[a-zA-Z_0-9]
zjzc01:/root/hei# cat a18.pl
sub matrix_read_file {
my ($filename) = @_;
open (F,$filename) || die;
while ($line=<F>){
chomp ($line);
next if $line=~/^s*$/; ##开头后面0个或者而多个空格结尾 ,表示空行
if ($line =~ /^([A-Za-z]w*)/){
$matrix_name=$1}
else{
my @row = split (/s+/,$line);
push (@{$matrix_name},@row);#将行数组插入到外层的矩阵数组中
print @{$matrix_name}[0]->[2];
}
};
print $matrix_name;
print "
";
close (F);
};
&matrix_read_file(aa);
zjzc01:/root/hei# perl a18.pl
3qqqa2
zjzc01:/root/hei# cat aa
abc
1 2 3
a1
1 b q
2
3
a2
散列表的散列表:
如果矩阵大而稀疏(只有一小部分的元素值不为0)的话
200zjzc01:/root/hei# cat a19.pl
$matrix={0=>{2=>100},1=>{0=>200},2=>{1=>300}};
print $matrix;
print "
";
print $$matrix{0}{2};
print "
";
print $$matrix{1}{0};
zjzc01:/root/hei# perl a19.pl
HASH(0xbc6518)
100
200zjzc01:/root/hei#
格式化打印工具:
在构建复杂的数据结构时,如果手头能有一种供调试用的格式打印工具就好了。
zjzc01:/root/hei# cat a20.pl
@sample=(11.233,{3=>4,"hello"=>[6,7]});
print @sample;
print "
";
print "111111111
";
print $sample[1]{hello}[0];
print "
";
zjzc01:/root/hei# perl a20.pl
11.233HASH(0x196e2c0)
111111111
6