Siechfred: Funktion "deprecated" nach Perl-Update auf Server?

Guten Abend,

baue gerade mal wieder an einem Script. Folgender Schnipsel hat bis zur letzten Bastelstunde (vor etwa 1 Monat) noch funktioniert:

if(!defined @logentries) {
    print LOG "$newaddr|$current_time\n";
  }
  else {
    foreach(@logentries) {
    print "$_\n";
    $_ =~ s/[\n\r]//g;
    ($ip, $time) = split(/|/, $_);
    if ($ip eq $newaddr) {
      flock(LOG,8);
      close(LOG);
      my $msg = "Sie haben vor weniger als $timestamp Minuten bereits Ihr Feedback hinterlassen.";
      error_win($msg);
    }
  }

Jetzt steht folgende Fehlermeldung in error.log:

"defined(@array) is deprecated at feedback.pl line 167.
 (Maybe you should just omit the defined()?)"

und der else-Zweig wird komplett ignoriert. Weiß jemand, was mir diese Fehlermeldung sagen will? Soweit ich bisher rauskriegen konnte, wurde auf dem Server vor kurzem die Perl-Version von 5.6.1 auf 5.8.0 geupdated.

Viele Grüße
Torsten

--
Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  1. Autsch,

    print "$_\n";

    Diese Zeile gehört hier nicht hin und ist in der Scriptversion auf dem Server nicht enthalten.

    Viele Grüße
    Torsten

    --
    Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  2. Hi,

    if(!defined @logentries) {

    Jetzt steht folgende Fehlermeldung in error.log:

    "defined(@array) is deprecated at feedback.pl line 167.
    (Maybe you should just omit the defined()?)"

    deprecated = abgelehnt
    im Sinne von Veraltet.

    "defined(@array) is deprecated at feedback.pl line 167.
     (Maybe you should just omit the defined()?)"

    Hast Du denn schon ausprobiert, was dort vorgeschlagen wird?

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. N'abend,

      (Maybe you should just omit the defined()?)"
      Hast Du denn schon ausprobiert, was dort vorgeschlagen wird?

      Dass ich "defined" einfach weglassen soll, habe ich mit meinen mageren Englisch-Kennznissen schon rausgefunden, würde das bedeuten, ich soll schreiben "if(! @logentries)"? Heißt das im weiteren, dass "!defined" nicht mehr funktioniert?

      Fragen über Fragen...

      Viele Grüße
      Torsten

      --
      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
      1. Hi,

        Dass ich "defined" einfach weglassen soll, habe ich mit meinen mageren Englisch-Kennznissen schon rausgefunden, würde das bedeuten, ich soll schreiben "if(! @logentries)"? Heißt das im weiteren, dass "!defined" nicht mehr funktioniert?

        Ist eigentlich logisch. Welchen Rückgabewert hat ein Array? defined() ist imho für skalare Werte gedacht. Bei denen funktioniert das auch weiterhin ohne Probleme, wie ich gerade ausprobiert habe.
        Was willst du denn überprüfen? Willst du wissen, ob das Array überhaupt exisitiert, oder was? Wenn ja, dann nutzte exists().

        Grüße Andres Freund

        --
        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
        1. N'abend Andres,

          Was willst du denn überprüfen? Willst du wissen, ob das Array überhaupt exisitiert, oder was? Wenn ja, dann nutzte exists().

          Um es mal laienhaft auszudrücken: ich will wissen, ob der Array überhaupt Werte enthält, definiert (?) ist er mit "my @logentries;"

          Viele Grüße
          Torsten

          --
          Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
          1. Moin Drachentöter *g*,

            Um es mal laienhaft auszudrücken: ich will wissen, ob der Array überhaupt Werte enthält, definiert (?) ist er mit "my @logentries;"

            Was spricht dann gegen ein "if (defined $logentries[0]){mache dies und das}? Das geht immer noch gut. Du kannst nur nicht defined auf einen ganzen array machen, weil da ja nicht klar ist, welcher wert nun abgefragt werden soll. Das Problem dabei kann allerdings sein, dass nicht umbedingt der 1. Wert definiert sein muss, sonder es auch der 4. sein kann. Dann  müsste man das anders machen.

            Grüße Andres Freund

            --
            ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
            1. N'abend,

              Moin Drachentöter *g*,

              *g* kleine Remineszenz an meine zweite Heimat *g*

              Was spricht dann gegen ein "if (defined $logentries[0]){mache dies und das}? Das geht immer noch gut.

              Dann dürfte doch auch "if(!defined $logentries[0])" gehen, oder ist das jetzt auch schon wieder deprecated?

              Viele Grüße
              Torsten

              --
              Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
              1. Hi "wegenBlattaufdemRücken" getöteter *g*,

                Dann dürfte doch auch "if(!defined $logentries[0])" gehen, oder ist das jetzt auch schon wieder deprecated?

                Nein, natürlich nicht. So hast du ja einen skalaren Rückgabewert. Ich hab es auch schnell ausprobiert, es geht.

                Grüß Andres Freund

                --
                ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
                1. N'abend,

                  Hi "wegenBlattaufdemRücken" getöteter *g*,

                  Lindenblatt bitte, so viel Zeit muss sein ;-)

                  Nein, natürlich nicht. So hast du ja einen skalaren Rückgabewert. Ich hab es auch schnell ausprobiert, es geht.

                  Danke für deine Hilfe, Fehler 1 von vermutlich weit über 100 dürfte beseitigt sein ;-))

                  Viele Grüße
                  Torsten

                  --
                  Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
          2. Hi!

            Was willst du denn überprüfen? Willst du wissen, ob das Array überhaupt exisitiert, oder was? Wenn ja, dann nutzte exists().

            Um es mal laienhaft auszudrücken: ich will wissen, ob der Array überhaupt Werte enthält, definiert (?) ist er mit "my @logentries;"

            Dann ist  if (@logentries)  der richtige Weg. Ein Array im skalaren Kontext ergibt immer die Anzahl der Werte im Array. Das if-Statement erzwingt immer skalaren Kontext auf die Bedingung in Klammern. Also ergibt @logentries hier entweder 0 (ein false-Wert), wenn es leer ist, oder einen Wert groesser 0 (ein true-Wert), wenn es nicht leer ist.

            So long

            --
            Es gibt Diebe, die nicht bestraft werden und einem doch das Kostbarste stehlen: die Zeit.
                -- Napoleon Bonaparte
  3. $_ =~ s/[\n\r]//g;

    Besser: s/\cM?\cJ//g;

    if ($ip eq $newaddr) {

    Klappt das eigentlich? Müsste darauf nicht ein unless ($time > $locktime) {} oder derartiges folgen?

    Johannes

    1. N'abend Johannes,

      if ($ip eq $newaddr) {
      Klappt das eigentlich? Müsste darauf nicht ein unless ($time > $locktime) {} oder derartiges folgen?

      Nein, die dazu gehörende Logdatei enthält bereits nur die Einträge, die diese Bedingung erfüllen.

      Viele Grüße
      Torsten

      --
      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  4. Guten Abend,

    baue gerade mal wieder an einem Script. Folgender Schnipsel hat bis zur letzten Bastelstunde (vor etwa 1 Monat) noch funktioniert:

    Da ist einiges im Unreinen

    if(!defined @logentries) {

    Du willst (hast du an anderer Stelle geschrieben) prüfen, ob @logentries Werte enthält. Was liefert ein array in skalarem Kontext? Richtig: Seine Länge. Ist ein Array leer, beträgt die Länge 0, was ein logisch falscher Wert ist, ergo:

    if( not @logentries ){

    oder einfach

    unless( @logentries ){

    siehe perldoc -f defined und perldoc perldata

    print LOG "$newaddr|$current_time\n";
      }
      else {
        foreach(@logentries) {
        print "$_\n";
        $_ =~ s/[\n\r]//g;

    Siehe perldoc perlport. Dieser Ausdruck ist maSgW* falsch, denn du wllst \012 und \015 verwenden.

    ($ip, $time) = split(/|/, $_);
        if ($ip eq $newaddr) {
          flock(LOG,8);
          close(LOG);

    Nein, böse. Erstens willst du die Fcntl ':flock' Konstanten verwenden, damit dein Script wenigstens Portablität heuchelt, zweitens willst du nicht explizit unlocken, wenn du _direkt danach_ close() verwendest.

    perldoc -f flock

    my $msg = "Sie haben vor weniger als $timestamp Minuten bereits Ihr Feedback hinterlassen.";
          error_win($msg);
        }
      }

    Jetzt steht folgende Fehlermeldung in error.log:

    "defined(@array) is deprecated at feedback.pl line 167.
    (Maybe you should just omit the defined()?)"

    Das ist schon _sehr_ lange der Fall. Du solltest dir mal eine aktuelle Perl-version zulegen, damit du solchen Dingen vorbeugen kannst. Aktuell ist 5.8.0 .

    und der else-Zweig wird komplett ignoriert. Weiß jemand, was mir diese Fehlermeldung sagen will? Soweit ich bisher rauskriegen konnte, wurde auf dem Server vor kurzem die Perl-Version von 5.6.1 auf 5.8.0 geupdated.

    "defined @array" ist auch schon mit 5.6.1 ungültig, vielleicht wurden aber jetzt endlich Warnungen forciert. Merke: Jedes Perl-Programm beginnt mit

    #!/usr/bin/perl
    use strict;
    use warnings;

    Wobei die erste Zeile variieren kann, je nachdem, wo perl liegt. Bei CGI-Programmen sollte sie etwa so aussehen:

    #!/usr/bin/perl -T

    HTH

    * mit an Sicherheit grenzender Wahrscheinlichkeit

    1. Guten Abend Richard,

      oder einfach
      unless( @logentries ){

      Klingt logisch, werde ich so umsetzen.

      $_ =~ s/[\n\r]//g;
      Siehe perldoc perlport. Dieser Ausdruck ist maSgW* falsch, denn du wllst \012 und \015 verwenden.

      An dieser Stelle funktioniert das Script imho noch.

      ($ip, $time) = split(/|/, $_);
          if ($ip eq $newaddr) {
            flock(LOG,8);
            close(LOG);
      Nein, böse.

      [pref:t=49582&m=271151] *SCNR*

      Erstens willst du die Fcntl ':flock' Konstanten verwenden, damit dein Script wenigstens Portablität heuchelt, zweitens willst du nicht explizit unlocken, wenn du _direkt danach_ close() verwendest.
      perldoc -f flock

      Ich kenne es nicht anders, werde mir die Doku zu flock ansehen.

      Merke: Jedes Perl-Programm beginnt mit
      #!/usr/bin/perl
      use strict;
      use warnings;
      Wobei die erste Zeile variieren kann, je nachdem, wo perl liegt. Bei CGI-Programmen sollte sie etwa so aussehen:
      #!/usr/bin/perl -T

      Mache ich wirklich einen so blöden Eindruck?
      ;-)

      Viele Grüße
      Torsten

      --
      Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.