This script which was made in Perl 5.8 version is not running on Perl 5.0. I don't want to upgrade Perl version since it is affecting lots of other scripts. I want to change mine so that it can be run on 5.0. Any suggestions?
This is the error message I get:
Can't locate File/Temp.pm in @INC (@INC contains: /usr/perl5/5.00503/sun4-so
laris /usr/perl5/5.00503 /usr/perl5/site_perl/5.005
/sun4-sola
ris /usr/perl5/site_perl/5.005
.) at urltimer.pl line 2.
BEGIN failed--compilation aborted at urltimer.pl line 2.
--------------------------
----------
----SCRIPT
--------------------------
--------
#!/usr/bin/perl -w
use File::Temp qw/ tempdir /;
use Time::HiRes qw/tv_interval gettimeofday/;
use POSIX qw(strftime);
#-------------------------
----------
----
# wget related Variable declarations
#-------------------------
----------
----
# number of seconds to wait for before each wget request times out
use constant WGET_TIMEOUT => 1;
# number of retries to wait for before wget give up
use constant WGET_RETRIES => 1;
# current run timestamp
use constant TIMESTAMP => strftime('%Y-%m-%d %H:%M:%S', localtime());
# subject for the warning mail
use constant SUBJECT => "open file failed ";
# recipient of the warning mail
use constant RECIPIENT => 'kpatel@prospectiv.com';
#-------------------------
----------
----
# trims a string
#-------------------------
----------
----
sub trim
{
$_ =~ s/^\s+//;
$_ =~ s/\s+$//;
return $_;
}
#-------------------------
----------
----
# open a file
#-------------------------
----------
----
sub open_or_die
{
# if @_ contains 1 element only then $#_ == 0
# in that case, ($fh, $fn) is initialized to be (undef, @_)
# in the first case,
# open_or_die opens $fn in the specified handled $fh
# in the second case, $fh is not specified, but will be returned through the return value of the function
my($fh, $fn) = $#_ ? @_ : (undef, @_);
open($fh, $fn) or (`mail -s "${SUBJECT}: ${fn}" ${RECIPIENT} < /dev/null` and die "cannot open: $fn\n");
return $fh;
}
#-------------------------
----------
----------
----------
----------
----------
---
# make a set of urls given the input file handle $fh and
# the transformer $to_url which transforms each line of the input file into a url
#-------------------------
----------
----------
----------
----------
----------
---
sub make_urls
{
my($fh, $to_url) = @_;
my(@definitions) = <$fh>; #@definitions now contains the lines from fh
# each line of definition is trimed (remove starting/trailing spaces) then processed by the custom to_url function
my(@reduced) = ();
for (@definitions)
{
$_ = trim($_);
if ($_)
{
push @reduced, ($_);
}
}
return map {$to_url->($_)} @reduced;
}
#-------------------------
----------
----------
-------
# processes the given url $url with $id, and
# record the result using the transformer $to_record
#-------------------------
----------
----------
-------
sub process_url
{
my($id, $url, $to_record) = @_;
# time a url fetch, returns NULL if no files were downloaded
sub time_url
{
my($url) = @_;
my($cmdline) = "wget -H -p -t" . WGET_RETRIES . " -T" . WGET_TIMEOUT . " -P\"" . $TEMPDIR . "\" \"$url\" 2>&1";
# @start time accurate to milliseconds
my(@start) = gettimeofday();
my($results) = "" . `$cmdline`;
# @end time accurate to millisecodns
my(@finish) = gettimeofday();
# if $results contains the text Downloaded: 0 Bytes...
# or $results does not contain the text Downloaded
# then download must have failed somehow.
# "NULL" value is returned
# otherwise, assume download to have succeeded,
# the time interval between @start and @finish is returned using tv_interval
return (($results =~ /Downloaded: 0 bytes in 0 files/) || ($results !~ /Downloaded/)) ? "0" : sprintf("%0.2f", tv_inter$
}
# prints the result transformed by the to_record transformer to the $RESULT handle
print $RESULT $to_record->($id, $url, time_url($url)) . "\n";
}
#-------------------------
----------
----------
----------
----------
----------
--------
# process all urls, given the input file name $fn, and
# transformers $to_url which converts each input line of the input file to a url and
# $to_record which converts the output data to a valid line of csv record
#-------------------------
----------
----------
----------
----------
----------
--------
sub process_urls
{
my($fn, $to_url, $to_record) = @_;
my %urls = make_urls(open_or_die($fn)
, $to_url);
while (($id, $url) = each(%urls))
{
process_url($id, $url, $to_record);
}
close($fn);
}
{
#-------------------------
----------
----------
----------
----------
----------
---------
# the script can take two or three paramters depending
# the first two params are the filename for the surveys and static urls respectively
# if only two parameters are passed to the script, then stdout is used for output,
# otherwise the third parameter specifies the result file
#-------------------------
----------
----------
----------
----------
----------
---------
$#ARGV >= 1 or print("usage: urltimer.pl survey.txt static.txt [result.txt]") and exit();
my($survey_fn, $static_fn) = @ARGV[0..1];
# context sensitive constants
#$RESULT = ($#ARGV == 1 ? STDOUT : open_or_die($ARGV[2]));
$RESULT = STDOUT;
$TEMPDIR = tempdir(CLEANUP => 1);
# process the server urls
process_urls($survey_fn,
# to_url for survey urls
sub {
return $_ => "
http://www.eversave.com/eversave/servlet/consumers.OpenReg?websiteid=${_}";
},
# to_record for survey urls
sub {
my($id, $url, $time) = @_;
join(",", $id, '', $time, TIMESTAMP);
});
# process static urls
process_urls($static_fn,
# to_url for static urls
sub {
my($id, $url) = split(/\s+/, $_, 2);
return $id => $url;
},
# to_record for static urls
sub {
my($id, $url, $time) = @_;
join(",",'' , $id, $time, TIMESTAMP);
});
}