Chris: syntax error in perl modul

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

  1. 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

  2. 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.

    1. 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

      1. 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.

        1. 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 ]  );

          1. 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.

  3. Moin Moin !

    "Standards" beachtet ?

    #!/path/to/perl -w
    use strict;

    Alexander

    --
    <!--#include file="signature.html" -->