Hauptmenü

Perl Fehlermeldung im LOG

Begonnen von raspklaus, 20 September 2015, 13:55:02

Vorheriges Thema - Nächstes Thema

raspklaus

Hallo,

ich verwende folgende Routine:

sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtGelberSack = '';
  my $dtRest = '';
  my $dtBio = '';
  my $dtBeda = '';
   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
    if ($Kalendertext =~ /Papiertonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
          Log(3, $dtPapier);
        }
    };
if ($Kalendertext =~ /Gelber Sack/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
        {
          $dtGelberSack  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Bio/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBio eq '' || ($eventDate < $dtBio && $eventDate > $t))
        {
          $dtBio  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pater Beda/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBeda eq '' || ($eventDate < $dtBeda && $eventDate > $t))
        {
          $dtBeda = $eventDate;
        }
    };   

   
  my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Papiertonne $dayDiff");
  }
  my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set GelberSack $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
    my $dayDiff = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Bio $dayDiff");
  }
    my $dayDiff = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pater_Beda $dayDiff");
  }
  }
}


Im Log kommt folgende Fehlermeldung:

"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 86.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 90.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 94.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 98.
2015.09.20 11:06:56 1: Including fhem.cfg
Subroutine myUtils_Initialize redefined at ./FHEM/99_MyUtils.pm line 10, <$fh> line 8.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 86, <$fh> line 8.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 90, <$fh> line 8.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 94, <$fh> line 8.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_MyUtils.pm line 98, <$fh> line 8.


Es scheint zwar nur eine Warnung zu sein, denn alles wird richtige verarbeitet. Leider komme ich mit Perl immer noch nicht so klar, dass ich dei Meldung unterdrücken kann.

Wie kann ich hier Abhilfe schaffen.

Danke für Eure Hilfe


raspklaus

Magst ja recht haben, aber aus den Suchergebnissen werde ich leider auch nicht schlau. Muss man $dayDiff irgendwie definieren ?

dev0

Ja, aber nicht mehrfach.
my $dayDiff;
$dayDiff = foo if...
$dayDiff = bla if...

raspklaus

Sorry, aber ich blicke immer noch nicht durch. Vielleicht wäre ja eine kleine Erklärung notwendig.

Ich habe jetzt eingetragen:

my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtGelberSack = '';
  my $dtRest = '';
  my $dtBio = '';
  my $dayDiff = 0;
  my $dtBeda = '';


aber die Warnungen bleiben

maxritti

Das sind jetzt zwar die Definitionen, aber von dem restlichen Code (wo du anfangs mehrfach das my $dayDiff = .... hattest) sieht man hier nicht wirklich viel.

Ist aber doch auch in dem ersten bei Google zu findenden Link zu ersehen.

my $x = 1;
my $y = 2;
my $x = 2;


erzeugt die Warnungen, dagegen ein

my $x = 1;
my $y = 2;
$x = 2;


nicht mehr.

und bitte die Beiträge zusammenfassen bzw einen löschen.

http://forum.fhem.de/index.php/topic,41264.0.html

An zwei Stellen das zu diskutieren ist doch doppelt gemoppelt.

raspklaus

Ich wollte den zweiten löschen habe aber keine Berechtigung

Ich habe jetzt modifiziert:

sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtGelberSack = '';
  my $dtRest = '';
  my $dtBio = '';
  my $dayDiff = 0;
  my $dtBeda = '';
   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
    if ($Kalendertext =~ /Papiertonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
          Log(3, $dtPapier);
        }
    };
if ($Kalendertext =~ /Gelber Sack/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
        {
          $dtGelberSack  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Bio/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBio eq '' || ($eventDate < $dtBio && $eventDate > $t))
        {
          $dtBio  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pater Beda/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBeda eq '' || ($eventDate < $dtBeda && $eventDate > $t))
        {
          $dtBeda = $eventDate;
        }
    };   

   
  $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Papiertonne $dayDiff");
  }
  $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set GelberSack $dayDiff");
  }
  $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
  $dayDiff = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Bio $dayDiff");
  }
  $dayDiff = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pater_Beda $dayDiff");
  }
  }
}


stimmt das dann so ?

rapster


raspklaus

#8
Tolle Antwort und sehr hilfreich. Passt zum Forum  ;D

und zu den üblichen Antworten der Entwickler

rapster

Dein Fehler wurde dir doch jetzt mittlerweile mehrmals erklärt, sogar mit Beispielen.

Hast du diese Hilfestellungen verwendet um dich in diese Problemstellung etwas weiter einzulesen?
z.B. einfach mal im web nach "strict, my, usw." suchen, z.B. http://www.perl.com/pub/2001/01/begperl6.html#use%20strict

Das sind allgemeine Perl Grundlagen, die wahrscheinlich auf den ersten 10 Seiten eines jeden Perl Buches zu finden sind.

- Die Deklaration einer Variablen darf nur einmalig erfolgen.
- Es macht nicht wirklich Sinn deine Variablen bei jedem for() Durchlauf erneut zu erstellen, das ist 1. sehr unüblich, und 2. k.A. ob dein Code dadurch so funktioniert wie du dir vorgestellt hast.
- ...

Wenn du deinen Code ausprobierst, etwas nicht funktioniert, und du ein neues konkretes Problem hast, wird dir bestimmt auch besser geholfen werden können.
Rudi hat hierzu auch mal was tolles gepostet "Wie sollte ich die Fragen formulieren" http://forum.fhem.de/index.php/topic,13092.msg105687.html#msg105687

Besser ?

Gruß
  Claudiu

maxritti

#10
Zitat von: raspklaus am 20 September 2015, 21:22:31
Tolle Antwort und sehr hilfreich. Passt zum Forum  ;D

und zu den üblichen Antworten der Entwickler
So langsam fragt man sich, ob es überhaupt noch Sinn macht irgendeine Antwort hier zu posten.
Wenn man noch nicht mal 3 Zeilen Code, wo das Problem eindeutig hervorgeht umgebaut bekommt, sollte man sich mal die Frage stellen, ob man das richtige System einsetzt oder ein wenig mit der Materie überfordert ist.

(http://www.aliqs.de/forum/Smileys/ExcellentSmileys1/smilie_frech_154.gif)