Christoph Schnauß: Useless use of a variable

hallo Forum,

ich habe mir ein kleines Suchscript gebastelt, das die HTML-Dokumente in einem Verzeichnis nach dem jeweils gewünschten Suchbegriff durchstöbert  -  das sind ein paar hundert Dateien. Mein Script arbeitet auch ganz brav und tut alles, was ich möchte, aber im log habe ich eine Meldung, die ich mir nicht erklären kann: "Useless use of a variable in void context at (Zeilennummer)". Na gut, eine überflüssige Variable, aber die angegebene Zeilennummer enthält nichts außer der schließenden Klammer einer "if"-Bedingung. und innerhalb dieser "if"-Bedingung gibt es keine "überflüssige" Variable.
An einer zweiten Stelle wird eine "überflüssige" Variable hier gesehen:
   if ($string =~ /<title>(.*)</title>/) {
Da gibt es nur eine "Variable", und die enthält mein Suchergebnis, sie kann gar nicht überflüssig sein. "leeren Kontext" sehe ich da auch nicht.

Die Arbeit meines Scripts wird davon nicht beeinträchtitg, aber ich würde diese Meldung, die sogar als "error" verzeichnet wird, gerne loswerden bzw. ihre Ursache beseitigen.

Grüße aus Berlin

Christoph S.

  1. hi,

    im log habe ich eine Meldung, die ich mir nicht erklären kann: "Useless use of a variable in void context at (Zeilennummer)".

    google mal nach "", du wirst einige seiten finden.

    u.a. http://www.oreilly.de/catalog/einperl3ger/chapter/f_Kap04.html:

    sub summe_von_fred_und_barney {

    print "Sie haben die summe_von_fred_und_barney-Subroutine
              aufgerufen.\n";
       $fred + $barney;  # Dies ist jetzt nicht mehr der Rückgabewert!
       print "Juhu! Jetzt bin ich der Rueckgabewert!\n";  # Hoppla!
     }

    Und was ist jetzt mit der Summe aus $fred und $barney in der Subroutine passiert? Wir haben den Wert nirgendwo abgelegt, also hat Perl ihn wieder verworfen. Hätten Sie die Warnungen eingeschaltet, so hätte Perl Sie höchstwahrscheinlich davor gewarnt, daß hier ein »useless use of addition in a void context« (eine unnütze Verwendung einer Addition ohne Zusammenhang) vorliegt. Dies ist nur eine andere Art zu sagen, daß die Summe in keiner Variable gespeichert oder von einer anderen Funktion benutzt wird. <<<

    hilft dir das irgendwie weiter ...?

    gruss,
    wahsaga

    1. hi,

      im log habe ich eine Meldung, die ich mir nicht erklären kann: "Useless use of a variable in void context at (Zeilennummer)".
      google mal nach "", du wirst einige seiten finden.

      bevorihr auf mich einschlagt, das man damit nichts oder auch alles finden kann :-) - ich meinte natürlich
      google mal nach "Useless use of a variable in void context"

      gruss,
      wahsaga

      1. hallo,

        google mal nach "Useless use of a variable in void context"

        keine Sorge, das war schon erfolgt, vielleicht etwas zu "streng" eingegrenzt. Ich hatte lediglich eine einzige Quelle gleifert bekommen: http://www.perlunity.de/perl/forum/thread_001409.shtml  -  und es ist nicht weiter hilfreich, was man da lesen kann.
        Dein oben angegebener link ist da etwas ausführlicher, enthält aber als Quintessenz auch nur die Aussage, daß man zur Vermeidung dieser Fehlermeldung doch bitte seine Variablen (oder deren Inhalt?) speichern solle. Ich bin mir aber nicht bewußt, daß ich mich eines solchen Versäumnisses schuldig gemacht hätte.

        Nur wenns zwingend erforderlich ist, schubse ich auch mal den entsprechenden Script-Code hier mit ins Forum, das _ganze_ Script ist zu groß für ein posting.

        Grüße aus Berlin

        Christoph S.

        1. hi,

          Nur wenns zwingend erforderlich ist, schubse ich auch mal den entsprechenden Script-Code hier mit ins Forum, das _ganze_ Script ist zu groß für ein posting.

          na ja, ein paar zeilen vor der als fehlerhaft gemeldeten oder ggf. die komplette funktion, in der der fehler auftaucht, können ja nie schaden.

          bin allerdings in perl kaum bewandert, hilfreiche antworten zum konkreten code musst du dir also wahrscheinlich eher von anderen erhoffen ;-)

          gruss,
          wahsaga

          1. hallo,

            na ja, ein paar zeilen vor der als fehlerhaft gemeldeten oder ggf. die komplette funktion, in der der fehler auftaucht, können ja nie schaden.

            Bittesehr. Es handelt sich um zwei "if"-Bedingungen. Die erste sieht so aus:
               if ($boolean => 'und' || !$boolean ) {
                  foreach $term (@terms) {
                     if ($case => 'Insensitive' || !$case ) {
                        if (!($string =~ /$term/i)) {
                           $include{$FILE} = 'no';
                           last;
                        } else {
                           $include{$FILE} = 'yes';
                        }
                     } elsif ($case => 'Sensitive' || !$case ) {
                        if (!($string =~ /$term/)) {
                           $include{$FILE} = 'no';
                           last;
                        } else {
                           $$include{$FILE} = 'yes';
                        }
                     }
                  }
            Die letzte Klammer wird angemeckert  -  und sämtliche Variablen sind durchaus vorhanden und auch erforderlich.
            Die zweite Bedingung lautet:
               if ($string =~ /<title>(.*)</title>/i) {
                  $titles{$FILE} = "$1";
               } else {
                  $titles{$FILE} = "$FILE";
               }
            Da wird dann die erste Zeile angemeckert.

            bin allerdings in perl kaum bewandert, hilfreiche antworten zum konkreten code musst du dir also wahrscheinlich eher von anderen erhoffen ;-)

            Wird schon noch jemand was dazu sagen können.

            Grüße aus Berlin

            Christoph S.

            1. hi!

              if ($boolean => 'und' || !$boolean ) {

              ^^

              if ($case => 'Insensitive' || !$case ) {

              ^^

              } elsif ($case => 'Sensitive' || !$case ) {

              ^^

              Du scheinst mit den Perl-Operatoren noch etwas durcheinanderzukommen.
              Ich empfehle daher mal die Sichtung von "perldoc perlop". Der zweite
              Code-Ausschnitt sah syntaktisch richtig aus und hat hier auch keinen
              Fehler erzeugt.

              bye, Frank!

              --
              Never argue with an idiot. He will lower you to his level and then
              beat you with experience.
              1. hallo Frank,

                if ($boolean => 'und' || !$boolean ) {
                                   ^^
                Du scheinst mit den Perl-Operatoren noch etwas durcheinanderzukommen.

                Ich habe das erst so hingeschrieben, nachdem ich bei anderen Operatoren immer wieder den Hinweis bekam, daß genau dieses Zeichen verkehrt wäre (was mich übrigens fast den ganzen Nachmittag gekostet hat). Die Variable $boolean, die ich hier benutze, ist der Name eines buttons, ich bekomme diese Variable über
                  if ($cgi->param('boolean')) {
                    $boolean = $cgi->param('boolean');
                  }

                Und es gab nochwas ganz Idiotisches: ich hab an dem Teil herumgeschraubt auf einer Windowskiste. _Nur_ mit diesen "=>" hat das Script die shebang "geduldet". Bei _jeder_ anderen Angabe mußte ich die shebang komplett streichen (was auf Windows ja möglich ist), und das hab ich erstens nicht verstanden, zweitens gar nicht gut gefunden.

                Und noch zu den von Andreas angemerkten zwei Dollarzeichen: ich muß langsam mal lernen, mit c&p genauer umzugehen. Im Original steht nur ein Dollar da, zwei wären mir gewiß zu teuer und würden wahrscheinlich auch noch zu einer anderern Fehlermeldung führen.

                Ich empfehle daher mal die Sichtung von "perldoc perlop".

                Das hab ich mir schon rausgezogen, in HTML verwandelt und teilweise für den Hausgebrauch übersetzt  -  eine ganz nützliche Gewohnheit.

                Der zweite Code-Ausschnitt sah syntaktisch richtig aus und hat hier auch keinen Fehler erzeugt.

                Na wenigstens etwas. Wahrscheinlich ist die Fehlermeldung, die ich gesehen habe, durch den ersten Fehler bedingt, sowas kommt ja vor.

                Grüße aus Berlin

                Christoph S.

              2. hallo,

                so, jetzt hab ichs gefunden. Wie so häufig lag das Problem zwar in der angegebenen Zeile, war aber etwas ganz anderes als vermutet. Ich habe mehr oder weniger zufällig mal die beiden Seiten vertauscht, so, daß mein "oder" eine andere Reihenfolge bekommt  -  siehe da, schon gibts keinerlei Probleme mehr. Da wird denn auch der "richtige" Operator akzeptiert, den du gerne wolltest, Frank. Jetzt sieht der Codeschnipsel so aus:

                if (!$boolean || $boolean eq 'und' ) {
                      foreach $term (@terms) {
                         if (!$case || $case eq 'insensitive' ) {
                            if (!($string =~ /$term/i)) {
                               $include{$FILE} = 'no';
                               last;
                            } else {
                               $include{$FILE} = 'yes';
                            }
                         } elsif (!$case || $case eq 'sensitive' ) {
                usw.

                Jetzt gibts aber noch ein zweites kleines Problem, diesmal mit einem regulären Ausdruck. Je nachdem, welcher Suchbegriff eingegeben wurde, gibt es einen kurzen Text - wenn der Suchbegriff existiert, wird die Dateiliste ausgegeben, wurde (versehentlich) kein Suchbegriff ins Formular eingetragen, gibt es einen entsprechenden Hinweis. Das geht ungefähr so:
                   if ($begriff) {
                      $text = "$begriff existiert in folgenden Dateien";
                   } elsif (!$begriff) {
                      $text = "<Formular wurde leer gelassen";
                Jetzt soll aber noch ein Hinweis kommen, falls ein Suchbegriff eingegeben wurde, der nirgends gefunden werden kann. Ich wollte das so machen:
                   } elsif (!($string =~ /$begriff/)) {
                      $text ="$begriff konnte nirgends gefunden werden";
                   }
                Und das haut nicht hin, es wird immer "$begriff existiert in folgenden Dateien" ausgegeben, auch wenn der Suchbegriff nicht existiert  -   die Suchliste bleibt danach natürlich leer. So, wie ich es jetzt hier angegeben habe, ist das auch logisch, weil in _dieser_ Form ja das erste "if" nur nach dem Vorhandensein von $begriff fragt, und diese Bedingung stimmt auch, wenn ein "falscher" Suchbegriff drinsteht.

                $string enthält den Inhalt sämtlicher Dateien. Es hat bisher nicht genutzt, das nochmal zu splitten  -  oder aber diese Bedingung als erstes "if" hinzuschreiben und die anderen darunter als "elsif" zu notieren. Ein paar Dutzend Varianten hab ich durchprobiert. Gibts noch einen hilfreichen Hinweis?

                Grüße aus Berlin

                Christoph S.

                1. hi  Christoph

                  ich habe mir das hier gebastelt und es funk bei mir :-))

                  ich habe versucht die erste if abfrage druch zuersetzen:

                  $begriff ? $text = "$begriff existiert in folgenden Dateien" : $text = "Formular wurde leer gelassen";

                  hat aber leider nicht gefunk. :-((

                  #!D:\Perl\bin\perl.exe
                  use strict;
                  use CGI::Carp qw(fatalsToBrowser);
                  print "Content-type: text/html\n\n";
                  print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
                  print "<html><head><title>Testausgabe</title>\n";
                  print "</head><body>\n";

                  my $begriff="mal";
                  #my $begriff="mall";
                  my $string="Hallo erstmal Schoenes WE";
                  my $text;
                  if($begriff){
                    $text = "$begriff existiert in folgenden Dateien";
                  }
                  else{
                    $text = "Formular wurde leer gelassen";
                  }
                  if (!($string =~ /$begriff/)) {
                    $text ="$begriff konnte nirgends gefunden werden";
                  }

                  print $text;
                  print "</body></html>\n";

                  bis bis roman

                  1. hallo roman,

                    $begriff ? $text = "$begriff existiert in folgenden Dateien" : $text = "Formular wurde leer gelassen";
                    hat aber leider nicht gefunk. :-((

                    Ich kommentiere das auch mal lieber nicht ;-)

                    #!D:\Perl\bin\perl.exe

                    oh. Selbst wenn du auf einer Windows-Kiste am Arbeiten bist, _dürfen_ in der shebang keine Backslashes als Pfadtrenner stehen, sondern es müssen normale slashes sein. Das gibt sofort einen Serverfehler.
                    Das einzige, deinem Server (Apache) erlaubt, ein Script mit einer solchen shebang doch auszuführen, ist der Befehl "ScriptInterpreterSource registry".

                    [funktionierender Code]

                    Das funktioniert tatsächlich, hilft mir aber nicht weiter, weil ich meine möglichen Suchbegriffe nicht alle ins Script schreiben kann, sondern sie aus einem Eingabenformular hole. Und natürlich habe ich keine Ahnung, wonach ein "user" nun grade suchen möchte.
                    Ich werde das Ganze mal auf eine temporäre Adresse hochladen, damit verständlich wird, was da los ist.

                    Grüße aus Berlin

                    Christoph S.

                    1. hi Christoph

                      Ich kommentiere das auch mal lieber nicht ;-)

                      wäre mir aber lieb den ich möchte ja aus meinen fehler lernen!!
                      hier ist mal der link http://selfhtml.teamone.de/cgiperl/sprache/bedingt.htm#entweder_oder
                      hier steht ganz unten eine verkürzte version nach der bin ich vorgegangen.
                      ich habe in letzter zeit die "entweder oder abfragen" sehr oft in JS benutzt vieleicht bin ich von daher etwas "versaut".

                      #!D:\Perl\bin\perl.exe
                      oh. Selbst wenn du auf einer Windows-Kiste am Arbeiten bist, _dürfen_ in der shebang keine Backslashes als Pfadtrenner stehen, sondern es müssen normale slashes sein. Das gibt sofort einen Serverfehler.

                      das wuste ich nicht und anscheinent hast du recht. ich werde das in meine scripten ändern.

                      [funktionierender Code]
                      Das funktioniert tatsächlich, hilft mir aber nicht weiter, weil ich meine möglichen Suchbegriffe nicht alle ins Script schreiben kann, sondern sie aus einem Eingabenformular hole. Und natürlich habe ich keine Ahnung, wonach ein "user" nun grade suchen möchte.

                      also das sollte doch kein thema sein *fg*

                      Ich werde das Ganze mal auf eine temporäre Adresse hochladen, damit verständlich wird, was da los ist.

                      ja mach mal

                      bis bis roman

                      1. wäre mir aber lieb den ich möchte ja aus meinen fehler lernen!!
                        hier ist mal der link http://selfhtml.teamone.de/cgiperl/sprache/bedingt.htm#entweder_oder
                        hier steht ganz unten eine verkürzte version nach der bin ich vorgegangen.

                        Da steht es auch so, wie ich es dir schon schrieb.

                        Struppi.

                        1. hi Struppi jetzt bist du mal dran :-)

                          altes posting von dir{

                          tztz,

                          $text = $begriff ? "$begriff existiert in folgenden Dateien" : "Formular wurde leer gelassen";

                          Struppi.}

                          Da steht es auch so, wie ich es dir schon schrieb.

                          ne leider nicht *fg* ganz unten steht :
                                              ======

                          $ENV{'HTTP_USER_AGENT'} =~ /MSIE/ ? print "Sie benuten den MSIE" : print "Sie benuten nicht den MS IE";

                          mein elend sah so aus :
                          $begriff ? $text = "$begriff existiert in folgenden Dateien" : $text = "Formular wurde leer gelassen";

                          also keine $irgendwasDAvor!!
                          nun gut ich werde (muss) mir das noch erarbeiten (wir hatten das thema schon mal mit JS).

                          @Christoph und Struppi

                          ich schreibe gerade auch eine größere webanwendung. da ich das nur nebenbei mache läuft das ganze schon eine weile und so mit sammelt sich auch "historischer deck" an.

                          wie behaltet ihr den überblick in großen script-strukturen?
                          erstellt ihr ein flußdiragamm?
                          erstellt ihr ein Lasten- Pflichtenheft?

                          bis bis roman

                          P.s. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
                          => ich denke mir meinen teil und ziehe das beste daraus :-)

                          1. hallo Roman,

                            mein elend sah so aus :
                            $begriff ? $text = "$begriff existiert in folgenden Dateien" : $text = "Formular wurde leer gelassen";
                            also keine $irgendwasDAvor!!

                            Nein, das nicht, aber die Variable hast du nach dem Doppelpunkt nochmal hingeschrieben, und es stimmte auch die Reihenfolge, welche Variable von welcher andren den Inhalt übernehmen soll, nicht.

                            wie behaltet ihr den überblick in großen script-strukturen?

                            Bei wirklich "großen" Strukturen baue ich ein kleines Initialisierungsscript, in das nach und nach die benötigten Bauteile geladen werden - bei PERL mit "require" zum Beispiel.
                            Das hat den Vorteil, daß ich alles erstmal in kleineren, überschaubaren Bausteinen zusammenschrauben kann, die nicht unbedingt was voneinander wissen müssen.

                            Die Frage ist, wann eine Script-Struktur tatsächlich "groß" ist. Interpretern und Compilern ist das relativ egal, Hautsache, der Code ist "richtig". Für mich liegt die Grenze der "Überschaubarkeit" ungefähr bei 1000 Codezeilen.

                            erstellt ihr ein flußdiragamm?
                            erstellt ihr ein Lasten- Pflichtenheft?

                            Zweimal Nein. Allerdings archiviere ich eine Weile diejenigen Fehlermeldungen, zu deren Beseitigung sich nicht gleich ein Weg finden ließ.

                            Ein "Pflichtenheft" wird nur dann erstellt/benutzt, wenn es sich um einen Auftrag handelt und der Auftraggeber so etwas unter anderem zur Abrechnung haben möchte.

                            Grüße aus Berlin

                            Christoph S.

                          2. ich schreibe gerade auch eine größere webanwendung. da ich das nur nebenbei mache läuft das ganze schon eine weile und so mit sammelt sich auch "historischer deck" an.

                            wie behaltet ihr den überblick in großen script-strukturen?
                            erstellt ihr ein flußdiragamm?
                            erstellt ihr ein Lasten- Pflichtenheft?

                            Gar nicht ;-)
                            nein
                            nein

                            Das einzige was ich mache, ist hin und wieder mal aufschreiben welche Module (um Funktionen dann entsprechend auszulagern) und was für Funktionen ich brauche.

                            Um halbwegs den Überblick zu behalten versuche ich möglich nur mit Modulen/Objekten zu arbeiten, die dann aufgrund einer eindeutigen Namensgebung (hoffentlich) mir Aufschluß geben was sie zu tun haben.

                            Struppi.

                      2. hallo Leute ;-)

                        wahrscheinlich muß ich doch öfter mal Pausen machen. Eben hab ich das letzte Problem beseitigen können, und  -  wie so oft  -  wars eine Stelle, an die ich die ganze Zeit nicht gerührt habe. Ich habe "weiter oben" im Script meine Variable $string noch so bearbeitet:
                           $string =~ s/\n//g;
                        was eine Zeit lang auch Sinn machte, weil es zu einer inzwischen verworfenen anderen Subroutine gehörte. Das Ding habe ich einfach vergessen, aber im Scriptverlauf hat diese Zeile natürlich noch "weitergelebt". Und weil ich schon beinahe dabei war, nochmal hier nachzufragen, habe ich mich gezwungen, mir mein _gesamtes_ Script selber nochmal Zeile für Zeile zu kommentieren. Dabei kams dann heraus  -  mein "Problem" stand allerdings ungefähr 120 Zeilen tiefer im Script, und _daran_ hatte ich jetzt fast zwei Tage herumgeknabbert und dabei gewissermaßen den Blick fürs Ganze verloren.

                        Ich muß mich trotzdem bedanken. Schließlich kam ich nur drauf, weil ich überlegt habe, wie ich euch mein "Problem" möglichst verständlich erklären könnte.

                        So, und jetzt noch zu Roman:

                        Ich kommentiere das auch mal lieber nicht ;-)
                        wäre mir aber lieb den ich möchte ja aus meinen fehler lernen!

                        Klar. Aber diesmal war Struppi schneller. Ich hätte dir dasselbe geschrieben, vielleicht mit ein paar Wörtern mehr ringsherum.

                        Grüße aus Berlin

                        Christoph S.

                  2. hi  Christoph

                    ich habe mir das hier gebastelt und es funk bei mir :-))

                    ich habe versucht die erste if abfrage druch zuersetzen:

                    $begriff ? $text = "$begriff existiert in folgenden Dateien" : $text = "Formular wurde leer gelassen";

                    hat aber leider nicht gefunk. :-((

                    tztz,

                    $text = $begriff ? "$begriff existiert in folgenden Dateien" : "Formular wurde leer gelassen";

                    Struppi.

                2. hi Christoph,

                  ich habe mich heute noch mal kurz mit der abfrage beschäfftigt und hier ist mal mein einzeiler :-))  (der übersichtlichkeit halber habe ich den einzeiler aus kommentiert und auf mehrere zeilen verteilt)

                  ich begine diese abfrageart zulieben in perl und JS kann ich damit gut "zaubern".

                  bis bis roman

                  --
                  P.S. manchmal wundere ich mich schon über die postings (fragen u. antworten) die man hier geboten bekommt(meine eigenen [leider] mit eingenommen)
                  => ich denke mir meinen teil und ziehe das beste daraus :-)
                  #!perl.exe   # man lernt ja nie aus :-)
                  use strict;
                  use CGI::Carp qw(fatalsToBrowser);
                  print "Content-type: text/html\n\n";
                  print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
                  print "<html><head><title>Testausgabe</title>\n";
                  print "</head><body>\n";
                  my $begriff="mal";
                  my $string="Hallo erstmal bis bis";
                  my $text;
                  #$begriff?($string=~/$begriff/?($text="$begriff existiert in folgenden Dateien"):($text ="$begriff konnte nirgends gefunden werden")):($text="Formular wurde leer gelassen");
                  $begriff?
                    ($string=~/$begriff/?
                      ($text="$begriff existiert in folgenden Dateien")
                    :
                      ($text ="$begriff konnte nirgends gefunden werden"))
                  :
                    ($text="Formular wurde leer gelassen");
                  print $text;
                  print "</body></html>\n";
            2. Hi,

              hallo,

              } elsif ($case => 'Sensitive' || !$case ) {
                          if (!($string =~ /$term/)) {
                             $include{$FILE} = 'no';
                             last;
                          } else {
                             $$include{$FILE} = 'yes';

              Da sind zuviele Dollars im Spiel...

              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/