一、需求①
目录名:/opt/etl_data/log/standlog
该目录下有日期目录:
/opt/etl_data/log/standlog/2012-10-22
/opt/etl_data/log/standlog/2012-10-23
/opt/etl_data/log/standlog/2012-10-24
.....
每个日期目录下有相应的日期文件:
/opt/etl_data/log/standlog/2012-10-22/20121022
/opt/etl_data/log/standlog/2012-10-23/20121023
/opt/etl_data/log/standlog/2012-10-24/20121024
.....
现要通过一个子程序实现将上述的日期文件找出来。
实现方法:
- sub product_filename{
- my ($dir)=@_;
- my (@datename,@list,$date);
- opendir DIR,$dir or die "Cann't open the $dir";
- @list=readdir DIR or die;
- for my $file (@list){
- next if $file =~ /\./;
- next if $file =~ /\.\./;
- push @datename,$file;
- }
- my ($dirname,@dirlist);
- for my $listdir (@datename){
- $dirname=$dir."/".$listdir;
- push @dirlist,$dirname;
- }
- my ($filename,$time,@filenames);
- for (@dirlist){
- $time = "$1$2$3" if /(\d+)-(\d+)-(\d+)$/;
- $filename = $_."/".$time;
- push @filenames,$filename;
- }
- return @filenames;
- }
参数传递:
- my $dir="/opt/etl_data/log/standlog";
- my @datelist=&product_filename($dir);
二、 需求②
现要针对这些文件作一些比对,根据我所要输入的日期时间段,找出对应的文件。
比如,我输入20121001 20121031,会打印出这个时间段的日期文件。
该子程序实现为:
- sub file_compare{
- my ($filetime,@filenames)=@_;
- my (%times);
- for (@filenames){
- $times{$_}="$1" if /(\d+)$/;
- }
- for my $key (keys %times){
- if ($filetime eq $times{$key}){
- return $key;
- }
- }
- }
file_compare子程序是将文件名作为键,文件名的最后一段日期作为值,存入%times散列表。
然后将传入的$filetime与%times散列表中的值进行比对,如果相同,返回文件名。
阅读(1593) | 评论(0) | 转发(0) |