On 10/03/2011 15:33, newbie01 perl wrote:
> Hi all,
>
> Just want to know what improvement can be done with the code below if any. I
> am sure a lot of improvement/changes is required. I will be calling this
> script from a UNIX script, i.e.timediff=`timediff.pl $file`, so $file will
> be passed to the Perl script. It's probably a good idea to check whether the
> $file is passed and if so, check if the file exists or not.
>
> Most of the print lines are just for testing/purposes. Ultimately, what am
> wanting to assign to the timediff variable in the UNIX script is the string
> "( 5 weeks, 3 days, 10:16:1 )" but only if the file is x days old. Do I need
> to have something like a return timediff_detail command in the Perl script?
>
> FYI, I've decided to use stat instead of Perl Date modules because each
> server have different Date modules installed, some have Date::Manip, some
> have Date::Calc etc. so using stat is the best option that I have.
>
> Any advise/help will be much appreciated. Thanks.
>
>
> -----
> Code for timediff.pl so far
> -----
>
> #!/usr/bin/perl
>
> #$today = localtime();
> $today_epoch = time();
> $today = localtime($today_epoch);
> @date_fields = split(" ",$today);
> $day=$date_fields[2];
> $month=uc($date_fields[1]);
> $year=$date_fields[4];
>
> @time_fields = split(":",$date_fields[3]);
> $hour=$time_fields[0];
> $minute=$time_fields[1];
> $second=$time_fields[2];
>
> print "Today is ==> $today \n";
> print "DAY is ==> $day ... \n";
> print "MONTH is ==> $month ... \n";
> print "YEAR is ==> $year ... \n";
> print "HOUR is ==> $hour ... \n";
> print "MINUTE is ==> $minute ... \n";
> print "SECOND is ==> $second ... \n";
>
> my ( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
> $atime, $mtime, $ctime,
> $blksize, $blocks )
> = stat("x1.pl");
>
> print "\n";
> print "< ======================================> \n";
> print "Output from stat ... \n";
> print " dev => $dev \n";
> print " ino => $ino \n";
> print " mode => $mode \n";
> print " nlink => $nlink \n";
> print " uid => $uid \n";
> print " gid => $gid \n";
> print " rdev => $rdev \n";
> print " size => $size \n";
> print " atime => " . localtime($atime) . " ==> \n";
> print " mtime => " . localtime($mtime) . " ==> \n";
> print " mtime - not localtime => " . $mtime . " ==> \n";
> print " ctime => " . localtime($ctime) . " ==> \n";
> print " blksize => $blksize \n";
> print " blocks => $blocks \n";
> print "< ======================================> \n";
> print "\n";
>
> $difference=$today_epoch-$mtime;
>
> $seconds = $difference % 60;
> $difference = ($difference - $seconds) / 60;
> $minutes = $difference % 60;
> $difference = ($difference - $minutes) / 60;
> $hours = $difference % 24;
> $difference = ($difference - $hours) / 24;
> $days = $difference % 7;
> $weeks = ($difference - $days) / 7;
>
> print "Age of x1.pl is: \n";
> print "( $weeks weeks, $days days, $hours:$minutes:$seconds ) \n";
> print "\n";
>
> exit 0;
>
> --------------
> Sample Output:
> --------------
>
> Today is ==> Fri Mar 11 02:56:22 2011
> DAY is ==> 11 ...
> MONTH is ==> MAR ...
> YEAR is ==> 2011 ...
> HOUR is ==> 02 ...
> MINUTE is ==> 56 ...
> SECOND is ==> 22 ...
>
> < ======================================>
> Output from stat ...
> dev => 84148225
> ino => 7975633
> mode => 33248
> nlink => 1
> uid => 103
> gid => 101
> rdev => 0
> size => 629
> atime => Fri Mar 11 01:07:26 2011 ==>
> mtime => Mon Jan 31 16:40:21 2011 ==>
> mtime - not localtime => 1296445221 ==>
> ctime => Thu Feb 10 19:09:46 2011 ==>
> blksize => 8192
> blocks => 8
> < ======================================>
>
> Age of x1.pl is:
> ( 5 weeks, 3 days, 10:16:1 )
You must always 'use strict; use warnings;' at the start of any Perl
program. They will make it much easier to find most trivial bugs.
It would simplify things a lot if you used the -M operator to establish
the age of the file. See 'perldoc -f -X'.
The program below does what you want.
HTH,
Rob
use strict;
use warnings;
my $file = 'x1.pl';
my $age = -M $file;
my $d = int $age;
$age = ($age - $d) * 24;
my $h = int $age;
$age = ($age - $h) * 60;
my $m = int $age;
$age = ($age - $m) * 60;
my $s = int $age;
my $w = int($d / 7);
$d %= 7;
printf "Age of %s is:\n( %d weeks, %d days, %d:%02d:%02d )\n", $file, $w, $d,
$h, $m, $s;
__END__
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/