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'} ";
}
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'} ";
}