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=();

posted @ 2017-06-17 09:25  MigrantWorkers  阅读(310)  评论(0编辑  收藏  举报