If you use the first version that Sudarshan posted, you might want to use
this instead. It uses map, and is a lot faster.
my $latest = (sort {$b->{mtime} <=> $a->{mtime}}
map {{mtime => -M $_, file => $_}}
<$dir/*>)[-1];
print $latest->{file}, "\n";
Benchmark results with and without using map:
Benchmark: timing 100 iterations of No-MAP, With-MAP...
No-MAP: 13 wallclock secs ( 2.43 usr 6.43 sys + 4.00 cusr 1.41 csys =
0.00 CPU)
With-MAP: 8 wallclock secs ( 1.57 usr 0.81 sys + 4.04 cusr 1.27 csys =
0.00 CPU)
Using map allows -M to be performed on each file only once (instead of once
per sort iteration). And since this is an expensive operation doing it only
once will save a lot of CPU time.
Rob
-----Original Message-----
From: Sudarshan Raghavan [mailto:[EMAIL PROTECTED]
Sent: Thursday, March 20, 2003 9:17 AM
To: Perl beginners
Subject: Re: Unix ls -lrt | tail -1 in Perl
On Thu, 20 Mar 2003, NYIMI Jose (BMB) wrote:
> Hello,
>
> How can I do this unix command in Perl ? : ls -lrt | tail -1
> Actually, i would like to get the most recent file from a given directory.
my $latest = (sort {-M $b <=> -M $a} <$dir/*>)[-1];
or
my $latest;
while (<$dir/*>) {
$latest = (defined ($latest) && (-M $_ > -M $latest)) ? $latest : $_;
}
Remember to check for the definedness of $latest if $dir is an empty
directory
>
> Thanks in advance for your input.
>
> Jos�.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]