perl-问题请教
时间:2010-09-16
来源:互联网
程序脚本如下:
#!/usr/bin/perl
use strict;
use warnings;
if(@ARGV < 1)
{
die "Usage: $0 [Filename]\n";
}
my $file = $ARGV[0];
open FH,"<",$file or die "Can't open $file: $!\n";
my (@a,$row,$col,$i,$j);
while(<FH>)
{
my @b = split;
push @a,[@b];
$col = @b;
$row++;
}
close(FH);
print "$row,$col\n";
for($i=0;$i<$row;$i++)
{
for($j=0;$j<$col;$j++)
{
print "...$a[$i][$j]...\n";
}
}
print "\t\t\t$a[3][0]\n";
if($a[3][0]=~ /(\d+).(\d+).(\d+).(\d+)/)
{
print "-$1-$2-$3-$4-\n";
}
my $hashref = [
{
$a[0][0]=>$a[1][0],
$a[0][1]=>$a[1][1],
$a[0][2]=>$a[1][2],
$a[0][3]=>$a[1][3],
$a[0][4]=>$a[1][4],
},
{
$a[0][0]=>$a[2][0],
$a[0][1]=>$a[2][1],
$a[0][2]=>$a[2][2],
$a[0][3]=>$a[2][3],
$a[0][4]=>$a[2][4],
},
{
$a[0][0]=>$a[3][0],
$a[0][1]=>$a[3][1],
$a[0][2]=>$a[3][2],
$a[0][3]=>$a[3][3],
$a[0][4]=>$a[3][4],
},
];
print "$hashref->[1]->{$a[0][0]}\n";
测试文件:peer_conn_stat,文件内容如下
a b c d e
1 2 3 4 5
6 7 8 9 10
1.0.0.22 m n p q
目的:实现打印文件peer_conn_stat的内容,并能够根绝里面的一些值做些数据统计之类的活。
状况:现在已经实现了用数组,和哈希数组引用打印里面的内容,但哈希数组的可扩展性不行(当peer_conn_stat的内容有大幅增加时)。
请教:请好心人帮忙用另外的方法实现哈希数组引用那部分,一定需要考虑可扩展性,也就是优化。(比如foreach $key (keys % hash)...组合),请高手帮忙实现之,谢谢。。
作者: peking_A_Liang 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
{
$a[0][0]=>$a[1][0],
$a[0][1]=>$a[1][1],
$a[0][2]=>$a[1][2],
$a[0][3]=>$a[1][3],
$a[0][4]=>$a[1][4],
},
{
$a[0][0]=>$a[2][0],
$a[0][1]=>$a[2][1],
$a[0][2]=>$a[2][2],
$a[0][3]=>$a[2][3],
$a[0][4]=>$a[2][4],
},
{
$a[0][0]=>$a[3][0],
$a[0][1]=>$a[3][1],
$a[0][2]=>$a[3][2],
$a[0][3]=>$a[3][3],
$a[0][4]=>$a[3][4],
},
];
这部分是问题点。。当数据量增加的时候,如果还是用这个散列数组引用,那么需要在这个结构里手动增加一些数据,智能性不好了
作者: peking_A_Liang 发布时间: 2010-09-16
作者: longbow0 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
这个可以用循环来做
作者: wfnh 发布时间: 2010-09-16
直接用二位数组 a[x][y] 就可以解决问题,不用这么麻烦。
如果是想用第1行的值作为 key 访问,可以
- $rh_col = {
- a[0][0] => 0,
- a[0][1] => 1,
- ...
- }
- $a[3][ $rh_col->{ $a[0][0]} ]
作者: longbow0 发布时间: 2010-09-16
就类似这样
my %hash_1;
my %hash_2;
foreach $key1(keys %hash1){
foreach $key2(keys %hash2)
{
.....
}
}
这种嵌套的哈希,可以实现否?主要是通过练习增强下perl的水平,刚学会简单使用perl,一周看了perl语言入门,加课后习题。
作者: peking_A_Liang 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
use strict;
use warnings;
$"=",";
if(@ARGV < 1) {
die "Usage: $0 [Filename]\n";
}
my $file = $ARGV[0];
open FH,"<",$file or die "Can't open $file: $!\n";
my (@a,$b,%hash);
while (<FH>) {
chomp;
@a=split (/\s+/);
$b=shift @a;
$hash{$b}=[@a];
}
foreach (keys %hash ) {
print "$_=>[@{$hash{$_}}]\n";
}
[oracle@imeg02 zgw]$ ./a.pl peer_conn_stat
6=>[7,8,9,10]
1=>[2,3,4,5]
a=>[b,c,d,e]
1.0.0.22=>[m,n,p,q]
是不是这样来存储数据?
作者: 99超人 发布时间: 2010-09-16
作者: peking_A_Liang 发布时间: 2010-09-16
然后
其实就是a=>[1,6,1.0.0.22]
b=>[2,7,m]
c=>[3,8,n]
d=>[4,9,p]
e=>[5,10,q]
明白了吧。。
作者: peking_A_Liang 发布时间: 2010-09-16
- #!/usr/bin/perl
- use strict;
- use warnings;
-
- if(@ARGV < 1)
- {
- die "Usage: $0 [Filename]\n";
- }
- my $file = $ARGV[0];
- open FH,"<",$file or die "Can't open $file: $!\n";
- my @keys;
- my @temp;
- my $row = 0;
- my $hashref;
- while(<FH>)
- {
- my @temp = split;
- if($row == 0){
- @keys = @temp;
- }else{
- my %temp_hash;
- for(my $i = 0;$i< scalar @keys;$i ++){
- $temp_hash{$keys[$i]} = $temp[$i];
- }
- push @$hashref,{%temp_hash};
- }
- $row++;
- }
- close(FH);
- print "$hashref->[1]->{$keys[0]}\n";
作者: 珞水的大叔 发布时间: 2010-09-16
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28