syntax error in perl modul
Chris
- perl
Hi Leute,
da noch recht unerfahren in sachen perl bin,
hoffe ich koennt mir einen Tip geben.
Habe ein Perlscript welches offline wunderbar funktioniert
wenn ich es jedoch ins netz stelle geht nichts mehr :-(
hier ein auszug und die stelle im Script die er anmeckert
syntax error at cntfunc.pm line 88, near "e"thostname($ENV{'REMOTE_ADDR'}), '|', $referer, '|', $ENV{'HTTP_USER_AGENT'}, ""
-->
sub UpdateStats {
my $referer = $CNT::ref || '';
$iplog{$ENV{'REMOTE_ADDR'}} = $time;
my $file = &Untaint("$DEF::datadir/$CNT::id.stat");
open(ST,">>$file");
flock(ST,2);
print ST $time, '|', e"thostname($ENV{'REMOTE_ADDR'}), '|', $referer, '|', $ENV{'HTTP_USER_AGENT'}, "\n";
my $size = tell(ST);
close(ST);
return $size;
} # End sub UpdateStats
wo liegt der fehler ist es e"thostname ?
------------------- Und 2. ter Fehler
syntax error at cntfunc.pm line 100, near "my $file = &Untaint(""
-->
my $file = &Untaint("$DEF::datadir/$CNT::id.reload");
liegt es vielleicht an der my anweisung?
Danke
Hallo Chris,
sub UpdateStats {
my $referer = $CNT::ref || '';
$iplog{$ENV{'REMOTE_ADDR'}} = $time;
my $file = &Untaint("$DEF::datadir/$CNT::id.stat");
mach hierraus zur Vorsicht mal
my $file = Untaint($DEF::datadir.'/'.$CNT::id.'.stat');
(das &-Zeichen fuer Prozeduren ist eine veraltete
Schreibweise, die man besser nicht mehr benutzen sollte)
open(ST,">>$file");
Hier fehlt ne Fehlerabfrage:
open ST,'>>'.$file or die $!;
flock(ST,2);
print ST $time, '|', e"thostname($ENV{'REMOTE_ADDR'}),
Was ist das denn?
liegt es vielleicht an der my anweisung?
Noe.
Gruesse,
CK
sub UpdateStats {
my $referer = $CNT::ref || '';
$iplog{$ENV{'REMOTE_ADDR'}} = $time;
my $file = Untaint("$DEF::datadir/$CNT::id.stat");
Der Punkt muss nicht markiert werden. Das '&' Zeichen ist überflüssig. (Du kannst das benutzen um Parameter durchzureichen)
open(ST,">>$file");
Funktioniert das? Immer prüfen!
open ST,">>$file" || die "Kann $file nicht öffne. Weil: $!";
flock(ST,2);
Funktioniert das? (Auf manchen Windowssystem nämlich nicht)
Ausserdem ist 2 nicht immer das was du willst (ich gehe mal von LOCK_EX aus).
Also:
use Fcntl qw(:flock);
flock ST, LOCK_EX || die "Lock schlug fehl. ($!)";
print ST $time, '|', e"thostname($ENV{'REMOTE_ADDR'}), '|', $referer, '|', $ENV{'HTTP_USER_AGENT'}, "\n";
Was ist das?
Eventuell willst du:
print ST "$time|". hostname($ENV{'REMOTE_ADDR'}).
"|$referer|$ENV{'HTTP_USER_AGENT'}\n";
Struppi.
Hey Danke,
bin schon weiter mit dem Script danke eurer Hilfe!
(sind total viele Fehler drin)
Noch eine hoffentlich kleiner Fehler
BEGIN not safe after errors--compilation aborted at cntfunc.pm line 802.
802 no strict 'refs';
sub GetCompressedStat {
if ( @main::COMP ) { # normale Statistik
no strict 'refs';
foreach my $line ( @main::COMP ) {
chomp($line);
my ( $tag, $val ) = split(/>/, $line, 2);
foreach ( split(/|/, $val) ) {
my ( $t, $v ) = split(/=/, $_);
if ( $t ne '' ) {
if ( $tag !~ /^years$/i ) {
my ( $a, $y, undef) = split(/[>_]/, $tag, 3);
my $item = $main::{ lc($a) };
${ $item }{$y}{$t} = $v;
} else {
$main::ycount{$t} = $v;
}
}
}
}
}
} # End sub GetCompressedStat
Habe am Scriptanfang ein "use strict" drin
ist das vielleicht das Problem
Oh man ich seh schon ich sollte mich mehr mit perl beschaeftigen
Danke Leute
Hey Danke,
bin schon weiter mit dem Script danke eurer Hilfe!
Vielleicht hilft dir diese FAQ noch weiter:
http://www.worldmusic.de/perl/mini-faq.html
BEGIN not safe after errors--compilation aborted at cntfunc.pm line 802.
802 no strict 'refs';
ist das die vollständige Meldung?
sub GetCompressedStat {
if ( @main::COMP ) { # normale Statistik
no strict 'refs';
foreach my $line ( @main::COMP ) {
chomp($line);
my ( $tag, $val ) = split(/>/, $line, 2);
foreach ( split(/|/, $val) ) {
my ( $t, $v ) = split(/=/, $_);
if ( $t ne '' ) {
if ( $tag !~ /^years$/i ) {
my ( $a, $y, undef) = split(/[>_]/, $tag, 3);
my $item = $main::{ lc($a) };
${ $item }{$y}{$t} = $v;
} else {
$main::ycount{$t} = $v;
}
}
}
}
}
} # End sub GetCompressedStat
auf die Schnelle is mir nicht ganz klar was hier passiert. Ist auf jeden Fall 'ne heikle Sache, die mit Sicherheit auch anders geht.
Habe am Scriptanfang ein "use strict" drin
ist das vielleicht das Problem
Jein. Du solltest es auf jeden Fall drin lassen, da dich das vor Tippfehler schützt.
Starte das Skript auch mal DOS Fenster (falls du Windows benutzt), dadurch kannst du eventuell Warnungen sehen, die dir weiterhelfen könnten.
Struppi.
Das ist die Fehlermeldung im Dos-Fenster
Content-type: text/html
<H1>Software error:</H1>
<PRE>Bareword "SendMail" not allowed while "strict subs" in use at D:\cgi\cntfunc.pm line 17.
BEGIN not safe after errors--compilation aborted at D:\cgi\cntfunc.pm line 802.
</PRE>
<P>
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
--------- Line 17
%EXPORT_TAGS = (Log => [ qw/ UpdateCounter UpdateStats UpdateReload ReadLogs GetStats CompressLogs Init / ],
Mail => [ SendMail ] );
Das ist die Fehlermeldung im Dos-Fenster
Content-type: text/html
<H1>Software error:</H1>
<PRE>Bareword "SendMail" not allowed while "strict subs" in use at D:\cgi\cntfunc.pm line 17.
BEGIN not safe after errors--compilation aborted at D:\cgi\cntfunc.pm line 802.
</PRE>
<P>
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
Das ist gut, es scheint du hast "use CGI::Carp qw/fatalsToBrowser/;" eingebunden, was wichtig ist um die Fehlermeldungen im Browser sehen zu können.
Aber das ist eine komplett andere Fehlermeldung als du uns vorher gesagt hast.
--------- Line 17
%EXPORT_TAGS = (Log => [ qw/ UpdateCounter UpdateStats UpdateReload ReadLogs GetStats CompressLogs Init / ],
Mail => [ SendMail ] );
Falls das die betreffende Zeile sein soll, sollte das entweder:
Mail => [ 'SendMail' ] ); oder Mail => [ &SendMail ] );
heissen. Kommt darauf an, was da passieren soll.
Struppi.
Moin Moin !
"Standards" beachtet ?
#!/path/to/perl -w
use strict;
Alexander