散列hash

1.print语句打印的区别
 
my %hash = (key1 => value1,
                     kye2 => value2);
print "%hash";   # 打印的结果就是一个字符串 : %hash
print %hash ;     # 打印结果和列表的一样,把key和value拼接串打印    key1value1key2value2
2.散列相关函数
keys
values
each   自动的循环hash体内的key value 至undef 然后再回到第一个key value
           注:无论调用keys values 都会将each的计数点回归到原点。
测试代码如下:
my %hash = (1 => 10,
                        2 => 20,
                        3 => 30,
                        4 => 40);
                        
while (my ($key ,$value) = each %hash) {
    print "$key -- $value  ";
}
print "--------------------------------- ";


my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my @key = keys (%hash);
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";
my ($key ,$value) = each %hash;
print "$key -- $value  ";




##### 执行结果#################
4 -- 40 
1 -- 10 
3 -- 30 
2 -- 20 
---------------------------------
4 -- 40 
1 -- 10 
3 -- 30 
4 -- 40 
1 -- 10 
3 -- 30 
2 -- 20 
 --  
reverse   注意值的唯一性
delete 彻底删除 key value
exists 针对key 是否存在
defined  针对value是否被定义,赋值
用法异同比较
语法相同点:
delete ( $hash{key});
exists ($hash{key});
defined($hash{key})
一个利用散列key唯一性的日志分析
#  日志格式如下。
#  要求按照第一字段分类,其余三个字段求和
#  处理结果为:
DS-SERVER-0009|0|0|0
DS-SERVER-0001|26|0|0
DS-SERVER-0011|0|0|0
null|0|0|0


原始log文件如下:
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|2|0|0
DS-SERVER-0001|1|0|0
null|0|0|0
null|0|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|19|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0011|0|0|0


日志分析代码:
#! /usr/local/bin/perl
#
# 多行日志分析


use strict;


my $logFile = "/shvpn/test/wlj/perl/hashLog.log";  # DS-SERVER-0001|1|0|0
open FILE, $logFile or die "cant open logfile $!  ";


my %hash; # DS-SERVER-0001|1|0|0  key 为第一字段,二层hash sum1,sum2 sum3分别代表三个字段求和


while (<FILE>) {
    if ($_ =~ /(.+)|(d+)|(d+)|(d+)/) {
#        if (exists $hash{$1}{'sum1'}) {     # 注:不用特意的去判断键值是否存在,会自动判断并处理
            $hash{$1}{'sum1'} += $2;
#        }
#        else {
#            $hash{$1}{'sum1'} = $2;
#        }
#        if (exists $hash{$1}{'sum2'}) {
            $hash{$1}{'sum2'} += $3;
#        }
#        else {
#            $hash{$1}{'sum2'} = $3;
#        }
#        if (exists $hash{$1}{'sum3'}) {
            $hash{$1}{'sum3'} += $4;
#        }
#        else {
#            $hash{$1}{'sum3'} = $4;
#        }
    }
}


foreach (keys %hash) {
    print "$_|$hash{$_}{'sum1'}|$hash{$_}{'sum2'}|$hash{$_}{'sum3'} ";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值