`
luogen33
  • 浏览: 82897 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

perl 学习

 
阅读更多
[SYSTEM1]
#config the country No.
COUNTRY_CODE= 7
#config the MMSCID of the MMSC Server
MMSC_ID= MMS          
#config the host name of the MMSC Server
HOST_NAME = HUAWEI
#config the dir of logs
LOG_PATH= $HOME/mms_home/cdr/changeBill/log
#config the source bill file's path.
SRC_CDR_PATH = $HOME/mms_home/cdr/bill/send 
#config the bill change  tmp dir
CHANGE_TMP_DIR=$HOME/mms_home/cdr/changeBill/buffer 
#config the map of areacode and areadir ,for each area
AREA_DIR_ITEM= 11000000,$HOME/mms_home/cdr/changeBill/Moscow
AREA_DIR_ITEM= 12000000,$HOME/mms_home/cdr/changeBill/Volga
AREA_DIR_ITEM= 13000000,$HOME/mms_home/cdr/changeBill/Center
AREA_DIR_ITEM= 14000000,$HOME/mms_home/cdr/changeBill/NorthWest
AREA_DIR_ITEM= 15000000,$HOME/mms_home/cdr/changeBill/South
AREA_DIR_ITEM= 16000000,$HOME/mms_home/cdr/changeBill/Ural
AREA_DIR_ITEM= 17000000,$HOME/mms_home/cdr/changeBill/Siberia
AREA_DIR_ITEM= 18000000,$HOME/mms_home/cdr/changeBill/FarEast
#config the dosen't matched areacode and dir.
#in this config item,the code must be configed "10000000"
AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/Notmatch
#AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/ITC
CHANGE_BAK_DIR = $HOME/mms_home/cdr/changeBill/ITC
#the config files dir
CONFIG_FILES_DIR=$HOME/mms_home/cdr/changeBill/.cfg

分享到:
评论
14 楼 luogen33 2012-05-11  
  printlog "finish processing $src_cdr_file";
       #删除掉这个刚出完的文件
       unlink "$cdr_file";
   #对生成的新话单,重新命名.
   my $date_tmp = `date +'%H%M%S'`;
   #去换行符
   chomp($date_tmp);
   #重命名临时转换文件,为定制话单名
   $new_file_name=  $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date_tmp" . "-" . substr($src_cdr_file,-4);
        foreach $areacode (keys %area_dir_map)
        {
#将文件移动到目标目录
    copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp" ,"$area_dir_map{$areacode}/$new_file_name";
#删除临时转换目录下的文件
unlink  "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp";
        }

#重命名备份文件
copy "$bak_tmp_file" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
    }
    else
    {
        printlog "open cdr file:$cdr_file failed!";
    }    
  }
  # 关闭原始目录的io流
  closedir(handledir);
  printlog "Finish processing cdr file in directory:$src_cdr_path!";
  return 0;
 
}

init_dirs_and_files();
before_start();
read_bill_record();
#如果打开了日志文件,那么退出前关闭文件
if ($open_log == 1)
{
   close LOG;
}
13 楼 luogen33 2012-05-11  
#P2E 不要52
if("52" eq $rec_type && $arr_cdr_field[5]=~/@/)
{
   next;
}
#E2P不要51
if ("51" eq $rec_type && $arr_cdr_field[4]=~/@/)
{
   next;
}
#过期或转LSS 时,不出52话单
if ("3" eq $success && "52" eq $rec_type)
{
    next;
}

if ( "4" eq $success && "52" eq $rec_type)
{
   next;
}

printf  $areacode "$record";
          }
        }
  
         #以写读的方式写话单文件,话单文件不存在就创建新的文件
         @arr_cdr_field = (); 
++$current_count;
       }
   #当每一个原话单文件读完时,关闭流
   close(fCdrHandle);
       #关闭写文件的流
   foreach $areacode (keys %area_dir_map)
       {
      close ($areacode);
   }
   #关闭临时备份文件
   close BAK_TMP_FILE;
  
   #记录当前mmsid number
   &writeCurr_num();
12 楼 luogen33 2012-05-11  
#定义转换后话单的第14个字段IMEI
$imei=$arr_cdr_field[36];
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值
#$type_1_ser=&changebilltype_1_ser_new_no16($arr_cdr_field[27]);
$type_1_ser="";
#定义转换后话单的第20个字段A_AREA
$a_area=trans_hex($arr_cdr_field[37]);
#定义转换后话单的第21个字段A_CELL
$a_cell=trans_hex($arr_cdr_field[38]);
#定义转换后话单的第28个字段Tarif Class
$tarif_class=$arr_cdr_field[12];
#定义转换后话单的第30个字段
$call_reference= $arr_cdr_field[34];            
#定义转换后话单的第33个字段
$mcc_mnc= $arr_cdr_field[39];
#定义转换后话单的第37个字段
#MODFIY BY LGG DTS2012031205074
$brt_session_id="";
if ( "" ne $sessionID )
{
    $brt_session_id= $sessionID.":".$tarif_class."|"."0";
}
#MODFIY BY LGG DTS2012031205074
#定义转换后的话单的第38个字段SGSN
#$msc_id =$arr_cdr_field[35];                   
$msc_id=&trans_ip($arr_cdr_field[35]);
#定义转换后的第41个字段CDR_UDF
# CDR_UDF 是一个组合字段 ,格式:TC=9999&APP=0
#TC
$tc =$arr_cdr_field[12];
#APP
$app=$arr_cdr_field[21];
if( $arr_cdr_field[9] <=2 )
{
    $app="0";
}
$cdr_udf="TC=" . $tc . "&" . "APP=" . $app;
$record=$rec_type . "," . $rec_number . ",,,". $imsi ."," . $msisdn ."," . $dialed . "," . $start_time . "," . $duration . "," . $success . ",".$dd_type.",".$call_type.",,".$imei.",," . $type_1_ser . ",,,,".$a_area.",".$a_cell.",,,,,,," . $tarif_class . ",,".$call_reference.",,,".$mcc_mnc.",,,,".$brt_session_id.",".$msc_id.",,,,". $cdr_udf ."\n" ;

#写临时备份文件
     printf BAK_TMP_FILE "$record";
11 楼 luogen33 2012-05-11  
#含有“+”号码为手机
if($is_sp_or_email1 != -1)
{

    if($country_code_index1!=-1)
{
       #去国家吗
       $dialed=substr($arr_cdr_field[4],length($country_code));
    }else
{
      #加“00”
      #$dialed="00" . substr($arr_cdr_field[4],1);
  $dialed= substr($arr_cdr_field[4],1);
    }
}
else
{
    $dialed=$arr_cdr_field[4];
}
}
#定义转换后话单的第8个字段Start_Time
$start_time=$arr_cdr_field[24];
if ("52" eq $rec_type)
{
     $start_time=$arr_cdr_field[25];
}
#定义话单的第9个字段Duration
$duration=$arr_cdr_field[13];
#定义转换后话单的第10个字段Success.
$success=$arr_cdr_field[17];
#定义转换后话单的第11个字段DD_TYPE
$dd_type=""; 
#51类型
if("51" eq $rec_type)
{
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
#以+号开始写05
                     #以8开始的号码写06
                     #其他填写空
$dd_type="05";

if($dialed =~ /^8/)
{
     $dd_type="06";
}
if($dialed =~ /^9/)
{
     $dd_type="";
}


}
  #52类型
  }
  elsif("52" eq $rec_type)
  {
#含有“+”号码为手机
if($is_sp_or_email1 != -1)
{
#以+号开始写05
                     #以8开始的号码写06
                     #其他填写空
$dd_type="05";

if($dialed =~ /^8/)
{
     $dd_type="06";
}
if($dialed =~ /^9/)
{
     $dd_type="";
}
}
}
#定义转换后话单的第12个字段CALL_TYPE
#先填空
$sessionID=$arr_cdr_field[40];
$call_type="";
if ("" ne $sessionID)
{
     $call_type="M0";
}
10 楼 luogen33 2012-05-11  
  #定义转换后话单的第2个字段 Rec_Number.
#$rec_number=&ch_num_to_64($arr_cdr_field[0]);
#采用动态生成
$rec_number=get_rec_number();
#定义转换后话单的第5个字段IMSI
             $imsi=$arr_cdr_field[2];
#是不是邮件地址,或sp
$is_sp_or_email1=index($arr_cdr_field[4],"+");
$is_sp_or_email2=index($arr_cdr_field[5],"+");
#是不是本国国家码
$country_code_index1=index($arr_cdr_field[4],$country_code);
$country_code_index2=index($arr_cdr_field[5],$country_code);
     #定义转换后话单的第6个字段 Msisdn 及第7个字段Dialed
#51类型
if("51" eq $rec_type)
{
    #含有“+” 号码为手机
    if ( $is_sp_or_email1 !=-1)
{
       if ($country_code_index1!=-1)
   {
   #去掉国家吗
      $msisdn=substr($arr_cdr_field[4],length($country_code));
   }else{
   # 加"00"
      # $msisdn="00" . substr($arr_cdr_field[4],1);
  $msisdn= substr($arr_cdr_field[4],1);
    }
}
else
{
    $msisdn=$arr_cdr_field[4];
}
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
         if ($country_code_index2!=-1)
{
          #去掉国家吗
          $dialed=substr($arr_cdr_field[5],length($country_code));
     }
else
{
          # 加"00"
           #$dialed="00" . substr($arr_cdr_field[5],1);
   $dialed= substr($arr_cdr_field[5],1);
     }
}
else
{
   $dialed=$arr_cdr_field[5];
}
  #52类型
  }
  elsif("52" eq $rec_type)
  {
    #含有“+”号码为手机.
if ($is_sp_or_email2 !=-1)
{
        if($country_code_index2 !=-1)
{
       #去国家吗
       $msisdn=substr($arr_cdr_field[5],length($country_code));
    }else
{
     #加“00”
     #$msisdn= "00". substr($arr_cdr_field[5],1);
                     $msisdn=  substr($arr_cdr_field[5],1);
    }
   
    }
else
{
   $msisdn=$arr_cdr_field[5];
}
9 楼 luogen33 2012-05-11  

while ($current_count < @records)
       {
        #获取其中一条计费话单   
        my @arr_cdr_field = split (/\,/, $records[$current_count]);
    #如果原始话单记录,区域码为空时.
if ("" eq $arr_cdr_field[23])
{
     $arr_cdr_field[23]=10000000;
}
#如果区域码配置有误.
my  $macth=0;
foreach $areacode (keys %area_dir_map)
{
    if ($areacode eq $arr_cdr_field[23])
{
     $macth++;
}
}
if (!$macth)
{
     $arr_cdr_field[23]=10000000;
#区域码配置有误时,做日志
if ($log_times==0)
{
            #printlog "some area codes in config  file :$INIFile is  configed error !";
#printlog "the bill records of  those areas ,are stored into the  default dir : $area_dir_map{10000000}!";
$log_times++;
            }
    }
#根据原始话单记录的第24位(区域码),进行匹配. 将转换后的话单,写到匹配上的区域目录下的临时文件.
        foreach $areacode (keys %area_dir_map)
        {
    #获得话单记录中区域号 ,根据区域号不同将记录写道不同话单目录.
   #if ($areacode  eq $arr_cdr_field[$#arr_cdr_field-1])
   if ($areacode == $arr_cdr_field[23])
           {
#定义转换后话单的第1个字段 Rec_Type .
$rec_type="52";
if ($arr_cdr_field[7] <= 2 )
{
     $rec_type="51";
}
8 楼 luogen33 2012-05-11  

elsif ($flag==1)
{
    #五位二进制,就一位为一时.
    if (1==$tmp_28_w[0])
{
   $type_1_ser="1"
}
if (1==$tmp_28_w[1])
{
   $type_1_ser="2"
}
if (1==$tmp_28_w[2])
{
  $type_1_ser="4"
}
if (1==$tmp_28_w[3])
{
   $type_1_ser="8"
}
if (1==$tmp_28_w[4])
{
  $type_1_ser="16"
}
}
return $type_1_ser;


}

#用来做话单分拣的方法.
sub read_bill_record
{  
#MMSC-ID+日期+序列号
#获取话单目录的所有话单文件
#
if(!opendir(handledir,$src_cdr_path))
{
  printlog "$src_cdr_path not exist!";
  return -1;
}
#
    printlog "begin processing cdr file in directory:$src_cdr_path!";
  
  #读取每一个文件
  my $file_index = 0;
  my @arr_record;
  my $record_index = 0;
  my (%arr_cdr_field, $Item);
  my $dest_cdr_file_name = "";
  my $src_cdr_file = "";
  my $log_times=0;
while (defined($src_cdr_file = readdir(handledir)))
  {
    #获取每一个话单文件,并且进行读取
    if (("." eq  $src_cdr_file) || (".." eq $src_cdr_file) || ($src_cdr_file !~/^[0-9]{8,}.[0-9]{4}$/ ))
    {
      next;
    }
#
    $cdr_file = "$src_cdr_path/$src_cdr_file";
#清空数组
    @records=();
    if(open(fCdrHandle, "$cdr_file"))
    {
    #如果文件正常打开,
#现在每个目录下面 打开几个临时文件
foreach $areacode (keys %area_dir_map)
{
            $dest_cdr_file_name = "$change_tmp_dir/$tmp_child_dirs{$areacode}/" . "." . "$src_cdr_file.tmp";
    open($areacode,">>$dest_cdr_file_name");
    }

        #打开临时备份文件
#生成保存mmsid number 的文件
    my  $bak_dir_tmp = &bak_dir_tmp();
        $bak_tmp_file =  "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";
open(BAK_TMP_FILE,">>$bak_tmp_file");

    #读整个文件
@records=<fCdrHandle>;
my $current_count=0;
7 楼 luogen33 2012-05-11  

# 将十进制转换为64进制的方法
$arr="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
sub ch_num_to_64(){
#参数
my @list_data=();
my $res_data;
my $res =$_[0];
if (int($res)==0){
  $res_data=0;
}
my $res2;
    while($res != 0)
    {
        $res2 = $res%64;
         push(@list_data,substr($arr,$res2,1));
        $res = int($res/64);
    }
     @list_data=reverse (@list_data);
     foreach $item (@list_data){
        $res_data.=$item;
     }
     return $res_data;
}

#转换后的话单序列号
#$arr_cdr_field[0]=$_[0] 原始话单的序列号
#1116160948004901012071000
sub changebill_sequence_no_new_no2()
{
#time
#从原始话单序列号中获得HHMM的时间.
my $param_0=$_[0];
my $test_time=substr($param_0,4,4);
#sequence_no
my $sequence_no=substr($param_0,$len-9,5);
my $mod_id=substr($sequence_no,1,1);
my $manager_id =substr($sequence_no,2,1);
my $seq_id=substr($sequence_no,3,2);
#water_id
my $water_id=substr($param_0,$len-2,2);
my $rest=$test_time.$mod_id.$manager_id.$seq_id.$water_id;
return $rest;
}

#获取新话单第16个字段
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值.
#传参$_[0]= $arr_cdr_field[27]
sub  changebilltype_1_ser_new_no16()
{

$tmp_28_data=$_[0];
$tmp_28_w[0]=substr($tmp_28_data,0,1);
$tmp_28_w[1]=substr($tmp_28_data,1,1);
$tmp_28_w[2]=substr($tmp_28_data,2,1);
$tmp_28_w[3]=substr($tmp_28_data,3,1);
     $tmp_28_w[4]=substr($tmp_28_data,4,1);
my $flag=0;
foreach $tmp_item (@tmp_28_w)
{
     if (1==$tmp_item)
{
    $flag +=1;
}
}
if ($flag > 1)
{
     #五位二进制有多位为1.
#新话单16位填16.
     $type_1_ser="16";
}
elsif ($flag==0)
{
    #五位二进制都为0
#暂且填"16"
$type_1_ser="16";

}
6 楼 luogen33 2012-05-11  

#生成保存mmsid number的文件
sub  create_curr_num_file
{
    #生成保存mmsid number 的文件
    $curr_num_file="$config_files_dir/.current_num.cfg";
    if(! -e "$curr_num_file")
    {
       `touch $curr_num_file`;
    }
}

#初始化目录及文件
sub init_dirs_and_files
{
      #初始化目录
      &mark_areadir_and_tmpdir();
      #初始化文件
  &create_curr_num_file();
}


#将16进制ip地址,转换为10进制
sub trans_ip
{
    my $src = $_[0];
    my $des = "";

    my $size = length($src);
if ($size !=
{
    return $des;
}
$_ = $src;
if (/[\dA-Fa-f]{8}/)
{
my $tmp;
$tmp=hex (substr($src,0,2));
$des=$tmp;
$tmp=hex (substr($src,2,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,4,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,6,2));
$des=$des . "." . "$tmp";
}
return $des;
}


sub trans_hex
{
my $src = $_[0];
    my $des = "";

my $size = length($src);
if ($size == 0)
{
return $des;
}

$_ = $src;
if (/^[\dA-Fa-f]+$/)
{
$des = hex($src);
}

return $des;
   
}
5 楼 luogen33 2012-05-11  
#保存当前 mmsid number
sub writeCurr_num
{
    #当前mmsid
open(CURR_NUM,">$curr_num_file");
printf CURR_NUM $curr_num;
close CURR_NUM;
}

#获得rec_number的方法
sub get_rec_number
{
  #获得当前rec_number
  my $temp_curr_num=$curr_num++;
  #判断是不是合法
  #超过最大值时,归1
  if ( $temp_curr_num >= 999_999_9999)
  {
      #范围超过归1
  #modfiy DTS2012042107444  by lgg 2012-04-23 begin
  $curr_num="1";
  #modfiy DTS2012042107444  by lgg 2012-04-23 end
  }
  #当前rec_number长度
  my $len = length($temp_curr_num);
  #不够十位补0
  my $rec_number="0" x (10-$len) .$temp_curr_num;
  #返回rec_number
  return $rec_number;
}

#获得临时备份目录
sub bak_dir_tmp
{
    #分拣时,临时备份目录
my @ITC_ARR=split(/\//,$change_bak_dir);
my $ITC_last_index=$#ITC_ARR;
my $ITC_last_prefix=$ITC_ARR[$ITC_last_index];
return "$change_tmp_dir/$ITC_last_prefix";
}

#创建每个区域的分拣目录.
#及临时分拣目录
sub mark_areadir_and_tmpdir
{
    #检测areadir是否存在
   foreach $areadir (values %area_dir_map)
   {
          if(! -d $areadir)
  {
    
              system("mkdir -p $areadir");
          }
   }
  
   #临时分拣目录
    foreach $areacode (keys %area_dir_map)
{
      if (! -d "$change_tmp_dir/$tmp_child_dirs{$areacode}")
      {
system("mkdir -p $change_tmp_dir/$tmp_child_dirs{$areacode}");
      }
    }

#分拣时,临时备份目录
my  $bak_dir_tmp = &bak_dir_tmp();
if (!-d "$bak_dir_tmp")
     {
    system("mkdir -p $bak_dir_tmp");
}

#分拣目录BAK 目录
if (!-d "$change_bak_dir")
{
  system("mkdir -p $change_bak_dir");
}

#配置目录
if (!-d "$config_files_dir")
{
     system("mkdir -p $config_files_dir");
}
}
4 楼 luogen33 2012-05-11  
    if($count_p>0)
{
     #删除每个目录下的.tmp文件
     for $areacode (keys %area_dir_map)
{
          unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}

#删除.tmp文件
my  $bak_dir_tmp = &bak_dir_tmp();
                             unlink   "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";

}
else
{
     
     #获取当前系统时间HHMMSS
my $date = `date +'%H%M%S'`;
#去换行符
chomp($date);
#当对应的原始话单文件不存在时,更改名字
$new_file_name=  $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date"."-" . substr($src_cdr_file,-4);
for $areacode (keys %area_dir_map)
{
#目标文件夹
                    copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file" ,"$area_dir_map{$areacode}/$new_file_name";
#删掉.tmp文件
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}

#重命名备份文件
my  $bak_dir_tmp = &bak_dir_tmp();
copy  "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
}
  }
}
#关闭各个区域的分拣目录
closedir $areacode;
       }
    #关闭原始话单目录
closedir SOR_PATH;
}


#读取当前mmsid number
sub getCurr_num
{
    my $tmp_curr_num=1;
my $config_lines=0;
    #读取当前mmsid
open(CURR_NUM,"<$curr_num_file");
while($line=<CURR_NUM>)
{
   #读取到不为null的行
   $line=~s/^\s*|\s*$//g;
   if (length($line)!=0&&$line=~/^\d{1,10}$/)
   {
       $tmp_curr_num=$line;
   $config_lines++;
   }
}
#配置了多个数字
if ($config_lines>1)
{
       print "can't config more than one curr_nums in the config file[$curr_num_file] EXIT .\n";
   print "please config the curr_num again ,the curr_num must be in [1--999_999_9999]\n";
       exit;
}
  
    $curr_num=$tmp_curr_num;
close CURR_NUM;
  
}

#插件异常处理
sub before_start
{
        #转换过程中话单中断
        &error_bill_press();
#获取当前要用的MMSID number
&getCurr_num();
}
3 楼 luogen33 2012-05-11  


#需要备份文件
my $log_exist =1 if -e $LOGFile;
if ($log_exist == 1)
{
#判断一下当前的文件大小,如果大于10M,那么更换一个新文件
#my $timestamp = gmtime;
my $log_bak = 0;
$log_bak = 1 if -s $LOGFile >= 20480000;
#需要备份文件
if ($log_bak == 1)
{
   #日志备份
   #my $timestamp = gmtime;
   #my $new_file_name = "decompose.log." . "$timestamp";
   #rename "decompose.log", "$new_file_name";
   #日志回滚
   if ($open_log==1)
   {
     close LOG;
   }
   unlink "$LOGFile";
}
}


#处理分拣异常
sub error_bill_press
{
       #打开原始话单目录
opendir  SOR_PATH , $src_cdr_path;
         foreach $areacode (keys %area_dir_map)
         {
#打开各个区域的分拣目录
opendir $areacode , "$change_tmp_dir/$tmp_child_dirs{$areacode}";
foreach $area_tmp_file (readdir $areacode)
{
  my $count_p=0;
    #排除. 或..的文件
      if (("." eq $area_tmp_file) || (".." eq $area_tmp_file))
  {
      next;
  }
      #如果区域的分拣目录中含有.tmp的文件.
  if ($area_tmp_file =~ /^.[0-9]{8,}.[0-9]{4}.tmp$/)
  {
$src_cdr_file=substr($area_tmp_file,1,length($area_tmp_file)-5);
   #chomp($src_cdr_file); 文件名字不可有换行符,注释掉该行
foreach $src_cdr_f (readdir SOR_PATH)
{
    #排除. 或..的文件
    if (("." eq $src_cdr_f) || (".." eq $src_cdr_f)||($src_cdr_f!~/[0-9]{8,}.[0-9]{4}$/) )
        {
           next;
        }
    #chomp($src_cdr_f); 文件名字不可有换行符,注释掉该行
  
    if($src_cdr_f eq $src_cdr_file)
{
  $count_p++;
  last;
    }
}
2 楼 luogen33 2012-05-11  

          if (/AREA_DIR_ITEM/)
  {
     my @arr=split(/=/,$_);
my @area_dir_item=split(",",$arr[1]);
#转换配置文件中的$HOME变量
$area_dir_item[1]=`echo $area_dir_item[1]`;
#去掉空格及换行符.
$area_dir_item[0]=~s/^\s*|\s*$//g;
$area_dir_item[1]=~s/^\s*|\s*$//g;
push @area_dir_map ,($area_dir_item[0],$area_dir_item[1]);
#获得tmp下面的文件夹名
my @arr_dirs=split(/\//,$area_dir_item[1]);
push @tmp_child_dirs , ($area_dir_item[0],$arr_dirs[@arr_dirs-1]);
          }
        $Item = 1;
     }
$Item = 0;
%area_dir_map=@area_dir_map;
%tmp_child_dirs=@tmp_child_dirs;
     close CONFIG;
  }
 
}

#读配置文件
read_decompose_ini();
#定义log文件
$LOGFile = "$log_path/decompose.log";
#标识log打开
$open_log=0;
#打开log
if (! -d $log_path)
{
    system("mkdir -p $log_path");
}

if (open LOG,">>$LOGFile")
{
   $open_log=1;
}

#输入一个参数,参数值为打印字符串
sub printlog
{
    #日志正常打开
    if ($open_log == 1)
   {
       my $date = `date +'%Y%m%d%H%M%S'`;
       chomp($date);
       my $string = "[" . "$date". "]" . "[" . "$$" . "][" . "$_[0]" . "]";
       print LOG "$string\n";
   }
}
1 楼 luogen33 2012-05-11  
#!/usr/bin/perl
use Time::Local;
use File::Copy;
#强制要求变量先声明,再使用
#use strict;
#根据原始计费话单.第24位字段将不同区域的话单
#分拣到不同的区域目录.
#同时对原始话单的记录格式,进行转换.
#write by 罗根根 2011-10-20
my $user = $ENV{'USER'};
if ($user eq "")
{
        print "Not define USER in environment parameter!\n";
        exit 0;
}
my $trans_num = `ps -fu $user | grep "decompose_bill.pl" | grep -v grep | grep -v su | wc -l`;

if ($trans_num >= 2 )
{
        print "decompose_bill.pl is still running,exit!\n";
        exit 0;
}


#加载配置文件
sub read_decompose_ini
{
   #配置文件
   my $INIFile = "decompose.ini";
  
   #判断decompose.ini是否存在
   if ( !-e  $INIFile)
   {
      print "can not  find the config file decompose.ini !\n";
      exit;
   }
   #加载配置
  if (open(CONFIG,"<$INIFile"))
  {
     @area_dir_map=();
@tmp_child_dirs=();
     while (<CONFIG>)
     {
        #去掉配置文件中注释
        if (m/^#+/)
{
   next;
}
#解析配置项
            $host_name= $1 if (m/^HOST_NAME\s*=\s*(.*)\s/i);  
$mmsc_id= $1 if  (m/^MMSC_ID\s*=\s*(.*)\s/i);  
            $country_tmp_code= $1 if (m/^COUNTRY_CODE\s*=\s*(.*)\s/i);    
            $country_code= "+" . $country_tmp_code;
$log_path = $1 if (m/^LOG_PATH\s*=\s*(.*)\s/i);
            $src_cdr_path = $1 if (m/^SRC_CDR_PATH\s*=\s*(.*)\s/i);
$change_tmp_dir= $1 if (m/^CHANGE_TMP_DIR\s*=\s*(.*)\s/i);
    $change_bak_dir= $1 if (m/^CHANGE_BAK_DIR\s*=\s*(.*)\s/i);
$config_files_dir= $1 if (m/^CONFIG_FILES_DIR\s*=\s*(.*)\s/i);

#转换配置文件中的$HOME变量(对配置文件中$HOME 的支持)
$log_path=`echo $log_path`;
$src_cdr_path=`echo $src_cdr_path`;
$change_tmp_dir=`echo $change_tmp_dir`;
$change_bak_dir=`echo $change_bak_dir`;
$config_files_dir=`echo $config_files_dir`;
#去空格及换行符.
$host_name=~s/^\s*|\s*$//g;
$mmsc_id=~s/^\s*|\s*$//g;
$country_code=~s/^s*|\s*$//g;
$log_path=~s/^\s*|\s*$//g;
$src_cdr_path=~s/^\s*|\s*$//g;
$change_tmp_dir=~s/^\s*|\s*$//g;
$change_bak_dir=~s/^\s*|\s*$//g;
$config_files_dir=~s/^\s*|\s*$//g;

相关推荐

    perl学习手札中文

    "Perl学习手札中文"是一份专为初学者设计的学习资料,旨在帮助读者快速掌握Perl语言的基础和高级特性。以下是对这些文件内容的概览: 1. **word.css**: 这个文件可能是样式表,用于定义文档中的排版和格式。在学习...

    perl学习资料,超好

    学会如何编写和使用正则表达式进行模式匹配、替换和分割字符串是Perl学习的重点。 3. **文件和目录操作**:Perl提供了丰富的内建函数来处理文件和目录,如 `open()`、`close()`、`&lt;FILEHANDLE&gt;`、`print FILEHANDLE...

    perl学习ppt全集

    "perl学习ppt全集"是一份详尽的教程资料,旨在帮助初学者和有经验的程序员深入理解Perl语言的核心概念和高级特性。这份资料可能包含一系列的PPT幻灯片,每一份都专注于不同的主题,旨在通过清晰的讲解和实例来提升...

    perl学习手札(简体中文)_简信昌

    关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”

    Perl学习文档

    这篇"Perl学习文档"包含了对Perl语言的全面介绍,无论你是初学者还是有一定经验的开发者,都可以从中受益。 文档可能涵盖了以下几个重要的Perl知识点: 1. **Perl基础语法**:Perl的语法规则和C语言类似,包括变量...

    超好perl学习教程

    "超好perl学习教程"可能是一套全面的教育资源,旨在帮助初学者和有经验的开发者提升Perl编程技能。 首先,Perl的语法简洁且灵活,它借鉴了C、sed、awk等语言的特性,使得编写代码既快速又高效。Perl中的变量类型...

    perl学习简明教程

    总的来说,Perl学习简明教程会涵盖以上所述的基础知识,包括但不限于变量、流程控制、字符串和正则表达式、文件操作、模块使用等。通过学习这个教程,你将能够理解和编写基本的Perl脚本,进一步探索其在实际问题中的...

    Perl_学习手札

    这份"Perl学习手札"是为那些想要深入理解Perl语言特性和应用的初学者或有一定经验的开发者准备的宝贵资源。 首先,Perl的核心特性在于其灵活性和表达力。Perl语法受到了C、sed、awk等多种语言的影响,这使得它在...

    非常著名的perl学习手札(初学者有福了)

    ### 非常著名的Perl学习手札(初学者有福了) #### 1. 关于Perl5 **1.1 Perl的历史** Perl是由Larry Wall在1987年开发的一种高级编程语言,最初的设计目的是为了简化文本处理任务,后来发展成为一种功能强大的...

    最经典的PERL学习文件——Perl语言入门

    #### 一、Perl语言概览与学习指南 **知识点1:Perl语言背景与特点** Perl是由Larry Wall于1987年开发的一种高级编程语言,设计初衷是解决文本处理和系统管理任务。它融合了C、shell scripting、awk和sed等语言的...

    perl个人学习笔记

    Perl是一种强大的脚本编程语言,...以上就是Perl学习笔记中涵盖的一些基础概念和操作。继续深入学习,你将能够编写更复杂的Perl脚本,解决各种实际问题。记得实践是学习编程的关键,多做练习,逐步提升你的Perl技能。

    Perl学习总结 - 副本.docx

    ### Perl学习总结知识点详解 #### 一、执行Perl程序的方法 Perl是一种强大的脚本语言,广泛应用于各种场景,包括系统管理、Web开发等。要执行一个Perl程序,首先要确保已经安装了Perl解释器。 - **文件后缀**:...

    Perl学习手札.chm

    Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm

    perl学习相关的内容

    "perl学习相关的内容"这个标题表明我们即将探讨的是关于Perl语言的学习资料,可能是教程、代码示例或者练习题。描述中提到的“经典文档”可能是指一些权威的Perl教程,帮助初学者掌握基础,并全面了解Perl编程。 ...

    Perl学习资料.zip

    Perl是一种高级的、通用的、解释型、...总的来说,"Perl学习资料.zip"可能包含了以上各个方面的教程、示例代码和练习,帮助学习者逐步掌握Perl编程。通过深入学习和实践,你可以利用Perl的强大功能解决各种实际问题。

    perl学习笔记参考

    ### Perl学习笔记参考 #### Perl简介 Perl是一种高级编程语言,全称为Practical Extraction and Report Language,由Larry Wall创建,并持续由他进行更新与维护。Perl最初被设计用于Unix环境下的编程任务,随着...

    经典perl学习资料(探索perl的世界)

    这份"经典Perl学习资料"的压缩包显然包含了深入学习Perl的讲义,可以帮助你全面理解并掌握这种语言的核心概念和技术。 Perl的起源可以追溯到1987年,由Larry Wall开发,其设计哲学是“易于阅读,难于编写”。Perl...

    perl 学习资料 - 高清版

    "Perl学习资料 - 高清版"这个压缩包显然为初学者提供了高质量的学习资源,尤其是对于想要深入理解Perl语言的人来说,这是一个非常有价值的资料集。 首先,我们来看其中包含的文件"Perl语言入门(第四版).pdf"。这...

Global site tag (gtag.js) - Google Analytics