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

I've made a script to fetch files via Net::FTP. The files are in directories which correspond with days of the week (i.e. Sun Mon Tue etc...). When fetching the files I need to rename them like this
FILE-11-12-03
Using the current date, which would correspond with the day of the week directory. For example: the file in /Wed would be named FILE-11-12-03. The file in /Tue would be named FILE-11-11-03, and so on. I'm sure there must be an easy way (maybe some module), but I'm oblivious. Thanks.
use Net::FTP; die "Please specify site.\n" unless ($ARGV[0]); $site = $ARGV[0]; chomp ($today = `date '+%a'`); chomp ($d = `date '+%d'`); chomp ($m = `date '+%m'`); chomp ($y = `date '+%y'`); $d -= 1; @days = grep { $_ ne $today } qw/Sun Mon Tue Wed Thu Fri Sat/; %month = (1, 31, 2, 29, 3, 31, 4, 30, 5, 31, 6, 30, 7, 31, 8, 31, 9, 30, 10, 31, 11, 30, 12, 31); $ftp = Net::FTP->new("$site", Debug => 0) or die "Cannot connect to $site: $@"; $ftp->login("reap",'only.hd') or die "Cannot login ", $ftp->message; foreach $day (@days) { $ftp->get("/data/logfiles/old/$day/24HourSummary.txt" ,"$site.$m-$d +-$y") or die "get failed ", $ftp->message; print "Finished $site.$m-$d-$y for $day.\n"; $d -= 1; if ($d == 0) { $m -= 1; $m = 12 if $m = 0; $d = $month{$m}; } } $ftp->quit;

Replies are listed 'Best First'.
Re: Help with dates
by shockme (Chaplain) on Nov 12, 2003 at 23:48 UTC
    Just use localtime:
    my ($mday, $mon, $year, $wday) = (localtime)[3..6]; $mon += 1; $year += 1900;
    Of course, this leaves you with a 4-digit year, but that's easy enough to fix:
    $year =~ s/^\d\d//;
    See perldoc -f localtime for more information.

    Update: Modified to include $wday and perldoc reference.

    If things get any worse, I'll have to ask you to stop helping me.

      Of course, this leaves you with a 4-digit year, but that's easy enough to fix:

      You mean that's easy enough to unfix. :-) I don't know why people still use 2-digit years, but I guess if that's what the OP wants...

      -- Mike

      --
      XML::Simpler does not require XML::Parser or a SAX parser. It does require File::Slurp.
      -- grantm, perldoc XML::Simpler

        I'm with you, and I originally wasn't even going to address the issue. But the OP's specs call for a 2-digit year, and far be it from me to violate specs. ;)

        If things get any worse, I'll have to ask you to stop helping me.

Re: Help with dates
by Paulster2 (Priest) on Nov 13, 2003 at 01:19 UTC

    Check out the Date::Manip module on CPAN, or try perldoc as it has quite an extensive writeup on it. It will enable you to manipulate any date in any way that you want.

    chomp ($today = `date '+%a'`); chomp ($d = `date '+%d'`); chomp ($m = `date '+%m'`); chomp ($y = `date '+%y'`);
    and
    @days = grep { $_ ne $today } qw/Sun Mon Tue Wed Thu Fri Sat/; %month = (1, 31, 2, 29, 3, 31, 4, 30, 5, 31, 6, 30, 7, 31, 8, 31, 9, 30, 10, 31, 11, 30, 12, 31);

    With Date::Manip this part of the code will become obsolete. You will no longer need to fill the %month hash, as you can just check against it. You can also see which day of the week it is. Date::Manip also uses UNIX "+%" (ie: +%j for julian date). Strong mojo for the needy date coder.

    Paulster2

Re: Help with dates
by Ninthwave (Chaplain) on Nov 12, 2003 at 23:53 UTC

    From the Perl Cookbook

    use Date::Calc qw(Day_of_Week Week_Number Day_of_Year); # you have $year, $month, and $day # $day is day of month by definition $wday = Day_of_Week($year, $month, $day); $wnum = Week_Number($year, $month, $day); $dnum = Day_of_Year($year, $month, $day);

    Update I read that backwords expected numeric to name. So how would we reverse it hmmmm.... I would go with shockme because depending on how deep you have to go back your function mishandles leap years.

    "No matter where you go, there you are." BB