perl编程问题
一、Hash类型
1、hash遍历输出:如果hash遍历输出的时候不是按key则会按数组输出。
my %hash=(); ${hash}{"a"}="1"; ${hash}{"b"}="2"; foreach my $temp (%hash){ print "$temp \n"; } #输出结果为: #a #1 #b #2 |
hash按keys遍历,才能输出正确的结果。
my %hash=(); ${hash}{"a"}="1"; ${hash}{"b"}="2"; foreach my $temp ( keys %hash){ print "$temp \n"; my $val=${hash}{$temp}; print "$val \n" } #输出结果为: #a #1 #b #2 |
2、hash赋值问题
my %hash=(); ${hash}{"a"}="1"; ${hash}{"b"}="2"; ${hash}{"c"}{"d"}; print Dumper(%hash); #这时候c=>{},而取不到d,改成${hash}{"c"}{"d"}=""就能解决问题; $VAR1 = 'c'; $VAR2 = {}; $VAR3 = 'a'; $VAR4 = '1'; $VAR5 = 'b'; $VAR6 = '2';
|
3、获取hash的长度
#!/usr/bin/perl -w use Data::Dumper;
my %h=(apple=>01, orange=>02, banana =>03); ${h}{"cccc"}{"asdfas"}=""; ${h}{"cccc"}{"asdaafas"}=""; ${h}{"cccc"}{"asaaaas"}=""; my $l=keys %{$h{"cccc"}}; print Dumper($l); 输出: #3 |
hash排序:1、按key排序 2、按值排序 cmp按ASIIC排序 <==>按数字排序
my %h=(apple=>01, orange=>02, banana =>03); foreach my $tmp (sort keys %h){ #按key排序 } |
my %h=(apple=>01, orange=>02, banana =>03); foreach my $tmp (sort {$h{a}<==>$h{b}} %h){ #按值升序排序 } |
my %h=(apple=>01, orange=>02, banana =>03); foreach my $tmp (sort {$h{b}<==>$h{a}} %h){ #按值降序排序 } |
#按值size排序 foreach my $key (sort {$fileInfo{$b}{"size"} <=> $fileInfo{$a}{"size"}} keys %fileInfo){ my $modify =${fileInfo}{$key}{"modify"}; $data[0][$rowNum][0] = ${fileInfo}{$key}{"ip"}; $data[0][$rowNum][1] = $key; $data[0][$rowNum][2] = ${fileInfo}{$key}{"size"}; $data[0][$rowNum][3] = $modify; } |
hash存放hash:
#!/usr/bin/perl -w use Data::Dumper;
my %h=(apple=>01, orange=>02, banana =>03); ${h}{"cccc"}{"asdfas"}=""; ${h}{"cccc"}{"asdaafas"}=""; ${h}{"cccc"}{"asaaaas"}=""; my $l=keys %{$h{"cccc"}}; my %hh=(); $hh{"xx"}=\%h; #hash存放hash foreach my $tmp (sort keys %hh){ #print Dumper(${hh}{$tmp}); print $hh{$tmp}; foreach my $temp (sort keys %{$hh{$tmp}}){ print Dumper($hh{$tmp}{$temp}); } } |
3、Hash引用和传递
#!/usr/bin/perl -w use Data::Dumper;
my %h=(apple=>01, orange=>02, banana =>03);#初始化赋值 ${h}{"cccc"}{"asdfas"}=""; ${h}{"cccc"}{"asdaafas"}=""; ${h}{"cccc"}{"asaaaas"}=""; print(\%h); sub print{ my $h=shift;#取出参数数组中的第一个 #my ($h,$l)=@_;接收多个参数 foreach my $temp (sort keys %{$h}){#将$h标识为hash,如果是数组就用@ print Dumper(${}->{$temp});#取出值 print Dumper(${}->{$temp}{"asdfas"});#取出值 } foreach my $temp (sort keys %{$h}){#将$h标识为hash,如果是数组就用@ print Dumper(${}->{$temp});#取出值 foreach my $tmp (sort keys %{$h}->{$temp}){ print Dumper(${}->{$temp}{$tmp});#取出值 } } } |
二、数组
1、降序排序
my @arr=1..20; foreach my $n(sort {$b <==>$a} @arr){ } |
三、时间
1、获取整点或者半点
my $time =time; my $tmp=$time%1800;#获取余数 my $check_time = (($time-$tmp) / 1800) * 1800;#取半点或者整点 毫秒数 |
四、子程序
1、子程序引用调用
sub a{} my %hash=(); $hash{"callback"}=\&a;#传递子程序 \&$hash{"callback"}();#调用子程序 |
五、应用设计模式及模块
#! /usr/bin/perl -w # 处理通用模板 # 1、判断是否主机运行 # 2、执行回调方法 # 3、判读是否邮件发送(邮件发送失败3次告警) # 4、判断是否发送文件 # 5、判断是否发送告警 # 6、清除历史文件 # package DataHandling; require Exporter;
use strict; our @ISA = qw (Exporter);#继承Exporter our @Exoprt = qw (process);#导出方法 our @version = 1.0;
#对外发布process方法 #param:hash #param={ # needMaster:true/false, # callback:sub #} #process处理结果 #result={ # mail:hash:{mailMaster:true/false,mailMeta:hash:{},mailData:Array}, # file:hash:{fileMaster:true/false,fileMeta:hash:{},fileData:Array,clearStrategy:regular expression}, # alarm:hash:{alarmName:String,alarmType:String,alarmContent:String} #} sub process{ my ($core)=@_; my %result;#处理 if(defined($core) && %{$core}){ %result=\&${$core}->{"callback"}();#执行回调方法 sendMail(${result}{"mail"}); sendFile(${result}{"file"}); sendAlarm(${result}{"alarm"}); clearFile(${result}{"file"}); dealSendFailure(); }else{ print "error param!"; exit; } } sub sendMail{} sub sendFile{} sub sendAlarm{} sub clearFile{} sub dealSendFailure{}
1; |
六、字符串和数字
1、比较:字符串使用
操作符描述: lt小于 gt大于 eq等于 le小于等于 ge大于等于 ne不等于 cmp比较,返回1,0,or-1 |
2、比较:数字比较
操作符描述 <小于 >大于 ==等于 <=小于等于 >=大于等于 !=不等于 <=>比较,返回1,0,or-1 |
七、调用外部命令
1、`cmd`
my $re=`cat -e /usr/local/test.txt`;#$re命令执行的结果 my $ret = $?;#$?命令执行是否成功,0为成功 |
2、system(cmd)
my $result=system("wget -T 60 -N -P ${BASE_PATH}temp/ --http-user=wxstcdc --http-password=w,,,xstc-dc555xx1 http://wx.wxscndxns.com/baxsiduloxg/wxsflow.log >/dev/null 2>&1"); #result命令执行是否成功,0为成功 if($result==0){#执行成功 move("${BASE_PATH}temp/wxsflow.log", "${BASE_PATH}wxsflow.log"); } |
八、深度克隆
1、一些场景中需要对引用类型进行拷贝,然后释放原类型的数据,达到一种缓存的效果。例如:hash存储数据,时间作为key,对时间下的所有值进行累加。如果数据量庞大,存取hash次数会随着数据量的增长而增多,hash的性能会下降。这种情况下,可以将时间点拆分为多个,一次处理一个时间点,处理完将其拷贝至其他hash中,释放现有hash,可以减少hash的数据膨胀导致性能问题,并且在合适的时刻将汇总的hash数据写入文件,释放内存,达到控制内存增长问题。
use Storable qw(dclone);#克隆模块 #深度克隆数据 %DC_fullData =(%DC_fullData,%{ dclone \%fullData }) ; %fullData=(); |