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

Greetings!

I need to select files created after a date. I do this check... and see that all files show the same date 31/11/69??

Where am I wrong? :)

Thanks!

#!/usr/bin/perl -w
use File::stat;
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR))
{
next if ($file =~ m/^\./);
my $mtime = (stat $file)[9];
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
print "file = $file $mday/$mon/$year\n";
}
1;

Replies are listed 'Best First'.
Re: File date
by Discipulus (Canon) on Sep 19, 2014 at 07:52 UTC
    Hello,

    File::stat is from 2003 and is an Object Interface to builtin Perl's stat function. with this:
    perl -e " use File::stat qw/stat/; my $mtime = (stat $ARGV[0])[9]; my +($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mt ime);print qq!file = $file $mday/$mon/$year\n!; " web-browser-gtk2.p +l file = 1/0/70 #WRONG
    i got the same error as you (dunno why you got epoch(1 january 1970) minus one day).
    with File::Stat (note the big S) is ok:
    perl -e " use File::Stat; my $mtime = (stat $ARGV[0])[9]; my($sec,$mi +n,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);prin t qq!file = $file $mday/$mon/$year\n!; " web-browser-gtk2.pl file = 11/2/110 #OK
    That is the rigth mtime of the file.

    Without using any module you use the core stat function and working as expected.
    perl -e " my $mtime = (stat $ARGV[0])[9]; my($sec,$min,$hour,$mday,$m +on,$year,$wday,$yday,$isdst) = localtime($mtime);print qq!file = $fil e $mday/$mon/$year\n!; " web-browser-gtk2.pl file = 11/2/110 #OK


    PS: Please view PerlMonks formatting tips and add code block.

    HtH
    L*

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

      ... function interface ... i got the same error as you

      Using the mtime accessor/method, it seems to work just fine

      $ perl -MPath::Tiny -le " print scalar gmtime( path( shift )->stat->mt +ime ) " . Mon Sep 14 09:38:52 2015 $ perl -MPath::Tiny -le " print scalar gmtime( path( shift )->stat->mt +ime ) " .. Fri May 29 06:13:23 2009 $ perl -MFile::stat -le " print scalar gmtime( stat( shift )->mtime ) +" . Mon Sep 14 09:38:52 2015 $ perl -MFile::stat -le " print scalar gmtime( stat( shift )->mtime ) +" .. Fri May 29 06:13:23 2009 $ perl -MPath::Tiny -le " print scalar gmtime( path( shift )->stat->mt +ime ) " NUL Error stat on 'NUL': Invalid argument at -e line 1. $ perl -MFile::stat -le " print scalar gmtime( stat( shift )->mtime ) +" NUL Can't call method "mtime" on an undefined value at -e line 1.

      File::stat is from 2003 and is an Object Interface to builtin Perl's stat function.

      File::stat is core, File::Stat is from 2003 and needs to be removed from CPAN :) maybe replaced with an independent non-core version of File::stat

Re: File date
by blindluke (Hermit) on Sep 19, 2014 at 08:05 UTC

    There are a few problems. First of all, your $file will contain the file name only, so you need to append the $dir to it. Just try it:

    #!/usr/bin/perl use v5.14; use File::stat; my $dir = '/tmp/'; opendir(DIR, $dir) or die $!; while (my $file = readdir(DIR)) { next if ($file =~ m/^\./); say "Good idea" if (stat($dir.$file)); die "Bad idea" if (not defined stat($file)); }

    Next one: if you want to use File::stat, you should use (stat $dir.$file)->9; instead of the way you use it now.

    And the last thing: you will need to add 1900 to the year, unless you want to see 114 instead of 2014. A working example:

    #!/usr/bin/perl use v5.14; use File::stat; my $dir = '/tmp/'; opendir(DIR, $dir) or die $!; while (my $file = readdir(DIR)) { next if ($file =~ m/^\./); my $mtime = (stat $dir.$file)->[9]; my($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime); $year += 1900; say "File: $file, Mtime: $mday/$mon/$year"; }

    regards,
    Luke Jefferson

      Thanks to all, and Luke was right: I should have used $dir.$file instead of $file, it is correct now.

      About the use File::stat or use File::Stat - Stat with a big S is unknown in my Perl?! Cannot install File::Stat in cpan! So I used File::stat (small 's'), and even as you suggested removed it and used the stat inside function. All is right now, thank you!
Re: File date
by Utilitarian (Vicar) on Sep 19, 2014 at 08:25 UTC
    You're expecting the core stat rather than the module File::stat which overrides the core function. Don't import the module (try replacing with use strict instead ;) ) and it should work.

    print "Good ",qw(night morning afternoon evening)[(localtime)[2]/6]," fellow monks."
Re: File date ( find rule age)
by Anonymous Monk on Sep 19, 2014 at 07:59 UTC