Gossamer Forum
Home : Products : Links 2.0 : Installation -- Unix :

Error: Substitution relacement not terminated.

Quote Reply
Error: Substitution relacement not terminated.
Hi everybody,
I have installed links 2 and when i run admin.cgi it gives the following error...
"Substitution replacement not terminated at links.cfg line 190"
and i have the following thing at line 190.......
"my @days = qw!Sunday Monday Tuesday Wednesday Thursday Friday Saturday!;"

Can anybody please look at it and help me out

Thanks in advance
Regs
JackofNone

Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
If you have quotes around the line, then you need to delete them. Also, you do need to change all the date routines in the links.cfg and db_utils.pl if you make any changes to one of the date subs.

Regards,

Eliot Lee

Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Thanks Elliot!
This was in 3 minutes (really fast). Sorry Elliot for posting the line in quotes. Its not in quotes but i have posted it by mistake. And moreover i have not changed any file in the links directory. Everything is same as it comes with the package.

Please see to it again.
Thanks again.
Regs
JackofNone

Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Hello Elliot,
Please help me with this. Actually i m doing free installation for crazy_val and i m having problem on her server. And i have never face such kinda problem. I have not even touch any line. Please help me Elliot.
I really want to help Val.
Thanks in Advance

Your Friend
JackofNone


Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Well...it could be a problem with the Local.pm module installed in her server. I would recommend downloading the newest Local.pm module (actually it is packed in the Time module at http://www.cpan.org) and then use require "/path/to/Local.pm"; rather than use Time::Local in the date routines.

Regards,

Eliot Lee

Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Thanks Eliot,
I'll check it out! will get back to you if i get into trouble again

You are really great.:)
Regs
JackofNone

P.S. Sorry for using 'll' instead of 'l' in your name. All other post of mine have 'll' in Eliot. ;)
Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Hi Eliot,
I have done exactly the way you have guided. But still i m having the same error. Ok below is how my date routine in links.cfg looks like.
--------------------------------------------------------------------------------------------------------------------
sub date_to_unix {
# --------------------------------------------------------
# This routine must take your date format and return the time a la UNIX time().
# Some things to be careful about..
# timelocal does not like to be in array context, don't do my($time) = timelocal (..)
# int your values just in case to remove spaces, etc.
# catch the fatal error timelocal will generate if you have a bad date..
# don't forget that the month is indexed from 0!
#
my $date = shift; my $i;
my %months = map { $_ => $i++ } qw!Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec!;
my ($day, $mon, $year) = split(/-/, $date);

exists $months{$mon} or return undef;
$day = int($day); $year = $year - 1900;

require "/home/crazyshady/www/cgi-bin/links/admin/Local.pm";
my $time = 0;
eval {
$time = &Time::Local::timelocal(0,0,0, $day, $months{$mon}, $year);
};
if ($@) { die "invalid date format: $date - parsed as (day: $day, month: $months{$mon}, year: $year). Reason: $@"; }
return $time;
}

sub unix_to_date {
# --------------------------------------------------------
# This routine must take a unix time and return your date format
# A much simpler routine, just make sure your format isn't so complex that
# you can't get it back into unix time.
#
my $time = shift;
my ($sec, $min, $hour, $day, $mon, $year, $dweek, $dyear, $tz) = localtime $time;
my @months = qw!Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec!;
$year = $year + 1900;
return "$day-$months[$mon]-$year";
}

sub long_date {
# --------------------------------------------------------
# This routine is for printing a nicer date format on the what's new page. It should
# take in a date in your current format and return a new one.
my $time = shift;
$time = &date_to_unix ($time);
my ($sec, $min, $hour, $day, $mon, $year, $dweek, $dyear, $tz) = localtime $time;
my @months = qw!January February March April May June July August September October November December!;
my @days = qw!Sunday Monday Tuesday Wednesday Thursday Friday Saturday!;
$year = $year + 1900;
return "$days[$dweek], $months[$mon] $day $year";
}

Note: The change which i had made is in bold

And here is my Local.pm
-----------------------------------------------------------------------------------------------------------------------
package Time::Local;
require 5.000;
require Exporter;
use Carp;

@ISA = qw(Exporter);
@EXPORT = qw(timegm timelocal);

=head1 NAME

Time::Local - efficiently compute time from local and GMT time

=head1 SYNOPSIS

$time = timelocal($sec,$min,$hours,$mday,$mon,$year);
$time = timegm($sec,$min,$hours,$mday,$mon,$year);

=head1 DESCRIPTION

These routines are quite efficient and yet are always guaranteed to
agree with localtime() and gmtime(), the most notable points being
that year is year-1900 and month is 0..11. We manage this by caching
the start times of any months we've seen before. If we know the start
time of the month, we can always calculate any time within the month.
The start times themselves are guessed by successive approximation
starting at the current time, since most dates seen in practice are
close to the current date. Unlike algorithms that do a binary search
(calling gmtime once for each bit of the time value, resulting in 32
calls), this algorithm calls it at most 6 times, and usually only once
or twice. If you hit the month cache, of course, it doesn't call it
at all.

timelocal is implemented using the same cache. We just assume that we're
translating a GMT time, and then fudge it when we're done for the timezone
and daylight savings arguments. The timezone is determined by examining
the result of localtime(0) when the package is initialized. The daylight
savings offset is currently assumed to be one hour.

Both routines return -1 if the integer limit is hit. I.e. for dates
after the 1st of January, 2038 on most machines.

=cut

BEGIN {
$SEC = 1;
$MIN = 60 * $SEC;
$HR = 60 * $MIN;
$DAY = 24 * $HR;
$epoch = (localtime(2*$DAY))[5]; # Allow for bugs near localtime == 0.

$YearFix = ((gmtime(946684800))[5] == 100) ? 100 : 0;

}

sub timegm {
$ym = pack(C2, @_[5,4]);
$cheat = $cheat{$ym} || &cheat;
return -1 if $cheat<0 and $^O ne 'VMS';
$cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAY;
}

sub timelocal {
my $t = &timegm;
my $tt = $t;

my (@lt) = localtime($t);
my (@gt) = gmtime($t);
if ($t < $DAY and ($lt[5] >= 70 or $gt[5] >= 70 )) {
# Wrap error, too early a date
# Try a safer date
$tt = $DAY;
@lt = localtime($tt);
@gt = gmtime($tt);
}

my $tzsec = ($gt[1] - $lt[1]) * $MIN + ($gt[2] - $lt[2]) * $HR;

my($lday,$gday) = ($lt[7],$gt[7]);
if($lt[5] > $gt[5]) {
$tzsec -= $DAY;
}
elsif($gt[5] > $lt[5]) {
$tzsec += $DAY;
}
else {
$tzsec += ($gt[7] - $lt[7]) * $DAY;
}

$tzsec += $HR if($lt[8]);

$time = $t + $tzsec;
return -1 if $cheat<0 and $^O ne 'VMS';
@test = localtime($time + ($tt - $t));
$time -= $HR if $test[2] != $_[2];
$time;
}

sub cheat {
$year = $_[5];
$year -= 1900
if $year > 1900;
$month = $_[4];
croak "Month '$month' out of range 0..11" if $month > 11 || $month < 0;
croak "Day '$_[3]' out of range 1..31" if $_[3] > 31 || $_[3] < 1;
croak "Hour '$_[2]' out of range 0..23" if $_[2] > 23 || $_[2] < 0;
croak "Minute '$_[1]' out of range 0..59" if $_[1] > 59 || $_[1] < 0;
croak "Second '$_[0]' out of range 0..59" if $_[0] > 59 || $_[0] < 0;
$guess = $^T;
@g = gmtime($guess);
$year += $YearFix if $year < $epoch;
$lastguess = "";
$counter = 0;
while ($diff = $year - $g[5]) {
croak "Can't handle date (".join(", ",@_).")" if ++$counter > 255;
$guess += $diff * (363 * $DAY);
@g = gmtime($guess);
if (($thisguess = "@g") eq $lastguess){
return -1; #date beyond this machine's integer limit
}
$lastguess = $thisguess;
}
while ($diff = $month - $g[4]) {
croak "Can't handle date (".join(", ",@_).")" if ++$counter > 255;
$guess += $diff * (27 * $DAY);
@g = gmtime($guess);
if (($thisguess = "@g") eq $lastguess){
return -1; #date beyond this machine's integer limit
}
$lastguess = $thisguess;
}
@gfake = gmtime($guess-1); #still being sceptic
if ("@gfake" eq $lastguess){
return -1; #date beyond this machine's integer limit
}
$g[3]--;
$guess -= $g[0] * $SEC + $g[1] * $MIN + $g[2] * $HR + $g[3] * $DAY;
$cheat{$ym} = $guess;
}

1;

Please help me out once again Eliot.
Thanks in Advance

Regs
JackofNone

Quote Reply
Re: Error: Substitution relacement not terminated. In reply to
Hi Eliot,
Please help me! I m very sorry if i am bothering you much but i m sure that i dont have anyother option for asking answers for these questions.

Sorry!

Your Fan
JackofNONE