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

Greetings Monks,

I am trying to write a code that would take next 5 files, and a previous according to the hour. My files are in

file_00.txt, file_01.txt , file_02.txt, file_03.txt

naming convention ( file_HOUR.txt ). If the Hour is 0 ( i.e midnight) i need to take file_23.txt, file_00.txt, file_01.txt, file_02.txt, file_03.txt, file_04.txt. - and accordingly for subsequent hours. But i am kind of stuck of putting up this logic, my so far code is

use Data::Dumper; @array_time=localtime; if ( $array_time[2] == 0 ) { print "Now the time is |$array_time[2]|..\n"; $firstFile = "file_"."23.txt"; print "First File will be |$firstFile|\n"; }
pointers to this is greatly helpful.

Thanks

Replies are listed 'Best First'.
Re: getting next 5 files according to hour
by JavaFan (Canon) on Feb 21, 2012 at 07:23 UTC
    Use the modulo operator (%):
    use 5.010; my $hour = (localtime)[2]; say $_ % 24 for $hour-1 .. $hour+2;
      Thanks for the reply.

      Can you explain the logic?

      Thanks

        I could. But I rather have you read the documentation first, and if there is something you don't understand, you ask a more specific question.
        Modular arithmetic might be a new concept, so I'll outline it very briefly.

        In modular arithmetic, all numbers are reduced to a smaller cyclic subset of integers by the process of dividing by the modulus and taking the remainder. So if you count modulo four starting at zero, you begin normally: 0, 1, 2, 3 When you reach 4, the modulus, you go back to zero, because 4 divided by 4 is 1, with remainder 0. So this restarts the cycle.

        For your problem, the hours of the day are modulo 24 - and you can probably see how this applies from there.

      Here is code for the same. You need to change path to where that files are..
      my $hour = (localtime)[2]; my $nu=0; if($hour eq 0) {$hour= 23;} else {$hour--;} my @files1 = <dir path of you file>; i.e. <C:\\WINDOWS\\*.log>; while($nu < 6) { if($hour>23) {$hour = 0;} my $hr= sprintf("%02d",$hour); foreach my $file (@files1) { if($file =~ /_($hr)\.txt/ ) {print $file . "\n";} } $hour++; $nu++; }