散列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、付费专栏及课程。

余额充值