Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi there Monks!
Trying to compare two dates, but I am not sure on this line:
if($file <= $exp_dir_date){...
because if it create directories like: 20111020 20110901 20110920, it will not delete the 20111001. Is there a better way to accomplish this? Here is the code I am talking about:
!/usr/bin/perl -w use strict; use POSIX qw(strftime); use Date::Calc qw( Today Add_Delta_Days); # get todays date::: my $file_date = sprintf "%04d%02d%02d", Today(); my $current_dir = "alldir"; my $exp_dir_date = sprintf "%04d%02d%02d",Add_Delta_Days( Today(), -45 + ); my $dir_name = strftime("%Y%m%d",localtime(time)); # when this runs, it will create a new dir in alldir directory. unless(-e $current_dir."/".$dir_name or mkdir ($current_dir."/".$dir_n +ame, 0755)) { die "Unable to create $current_dir."/".$dir_name\n"; } print "\n**\n"; #now open $current_dir and read its content deleting any directory old +er than 45 days opendir (DIR, $current_dir) or die "Couldn't open directory, $!"; while (my $file = readdir DIR) { next if $file=~/^\./; if($file <= $exp_dir_date){ print "\nDELETE:::$file - $file_date - $exp_dir_date\n\n"; rmdir("alldir/$file"); #-------> remove directory }else{ print "\nOK:::$file* = $file_date - $exp_dir_date\n\n"; } } closedir DIR; print "\n\ndone\n";
Thanks for looking!

Replies are listed 'Best First'.
Re: Compare dates help!
by Ratazong (Monsignor) on Oct 21, 2011 at 06:35 UTC

    I guess your problem is that the comparision does not work for you in the following line:

    if($file <= $exp_dir_date){...
    Your dates (e.g. $exp_dir_date or the filenames) are strings, therefore you should use the string compare operators instead of <=, = ... . In your case le would be the correct one.

    HTH, Rata
Re: Compare dates help!
by williams554 (Sexton) on Oct 21, 2011 at 04:58 UTC
    #!/usr/bin/perl use strict; use POSIX qw(strftime); use Date::Calc qw( Today Add_Delta_Days); my $older_than = 45; # get todays date::: my $file_date = sprintf "%04d%02d%02d", Today(); my $current_dir = "alldir"; my $exp_dir_date = sprintf "%04d%02d%02d",Add_Delta_Days( Today(), -45 + ); my $dir_name = strftime("%Y%m%d",localtime(time)); # when this runs, it will create a new dir in alldir directory. unless(-e $current_dir."/".$dir_name or mkdir ($current_dir."/".$dir_n +ame, 0755)) { die "Unable to create $current_dir."/".$dir_name\n"; } print "\n**\n"; #now open $current_dir and read its content deleting any directory old +er than 45 days my @files = </$current_dir/*>; foreach my $filename (@files) { next unless (-d $filename); # this is only letting dirs get past if ( int( -M $filename) > $older_than) { print"dir is old:$filename\n";#print what is deleted here. # test what you are going to delete #&erase_directory ($filename); # after test uncomment this #rmdir $filename; # after test uncommnet this } } sub erase_directory { my $directory = shift @_; my @files = <$directory/*>; foreach (@files){ unlink "$_"; } }

    You asked this somewhere else too. I'm not sure what the monks say about that but in case you're lost or confused... Good luck, Rob

      What about this, and that's right, that's how we all learn, let me know:
      #!/usr/bin/perl -w use strict; use POSIX qw(strftime); use Date::Calc qw( Today Add_Delta_Days); # get todays date::: my $file_date = sprintf "%04d/%02d/%02d", Today(); my $current_dir = "alldir"; my $exp_dir_date = sprintf "%04d/%02d/%02d",Add_Delta_Days( Today(), - +45 ); print "\n45 Days ago:::$exp_dir_date\n"; my $dir_name = strftime("%Y%m%d",localtime(time)); # when this runs, it will create a new dir in alldir directory. unless(-e $current_dir."/".$dir_name or mkdir ($current_dir."/".$dir_n +ame, 0755)) { die "Unable to create $current_dir."/".$dir_name\n"; } #now open $current_dir and read its content deleting any directory old +er than 45 days opendir (DIR, $current_dir) or die "Couldn't open directory, $!"; while (my $file = readdir DIR) { next if $file=~/^\./; $file =~ s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/; if($file lt $exp_dir_date){ $file =~ s/(\d{4})\/(\d{2})\/(\d{2})/$1$2$3/; print "\nDELETE:::$file - $file_date - $exp_dir_date\n\n"; rmdir("alldir/$file"); #-------> remove directory }else{ print "\nOK:::$file* = $file_date - $exp_dir_date\n\n"; } } closedir DIR; print "\n\ndone\n";
Re: Compare dates help!
by ikegami (Patriarch) on Oct 21, 2011 at 02:37 UTC
    Is there a problem? What is it?