1.print语句打印的区别
my
%hash
=
(key1
=>
value1
,
kye2 => value2);
print " %hash " ; # 打印的结果就是一个字符串 : %hash
print %hash ; # 打印结果和列表的一样,把key和value拼接串打印 key1value1key2value2
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
--
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})
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
# 要求按照第一字段分类,其余三个字段求和
# 处理结果为:
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'} " ;
}
#
# 多行日志分析
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'} " ;
}