Spocky: use strict: Fehler mit "my $in{$name}"

Hallo liebe Selfhtml-Community,

ich habe ein Problem mit einem Wert im "use strict"-Modus.

Bei folgendem Wert erhalte ich immer die Fehlermeldung "Global symbol "%in" requires explicit package":

$in{$name} = $value; (Teilcode zum auszulesen des Querystrings)

Wenn ich ein "my" davor setze, also "my $in{$name} = $value;", kommt eine neue Fehlermeldung: "syntax error at script.cgi line 30, near "$in{""

Ich habe Google schon fast komplett zu diesem Thema abgegrast, aber nirgendwo etwas dazu finden können.

Hat jemand einen Rat wie ich in diesem Fall "my" platzieren muss/kann?

  1. Hier noch der Scriptcode:

    if($ENV{'REQUEST_METHOD'} eq "GET"){ my $in = $ENV{'QUERY_STRING'};}  
    elsif($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, my $in, $ENV{'CONTENT_LENGTH'});}  
    my $value =~ s/§/-/; my $in; my $pair; my $name;  
    my @pairs = split(/&/, $in); foreach $pair (@pairs) {  
    ($name, $value) = split(/=/, $pair);  
    $name =~ tr/+/ /;  
    $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
    $value =~ tr/+/ /;  
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;  
    $value =~ s/\|/-/;  
    $value =~ s/&&/&/;  
    $value =~ s/§§/-/;  
    $value =~ s/§/-/;  
    $in{$name} = $value; # Wie hier "my" platzieren?  
    }
    
    1. Hi,

      Hier noch der Scriptcode:

      Dieser Code schreit nach dem CGI-Modul.

      Ansonsten musst du %in (den Hash) einmal mit my bekanntmachen, vorzugsweise außerhalb der if-/else-Konstruktion.

      Bis die Tage,
      Matti

      1. Ansonsten musst du %in (den Hash) einmal mit my bekanntmachen, vorzugsweise außerhalb der if-/else-Konstruktion.

        Jetzt klappts, danke!

        Hier noch der Scriptcode:
        Dieser Code schreit nach dem CGI-Modul.

        Den muss ich noch debuggen.

    2. Ich fürchte, du bist Opfer eines grausamen Scherzes geworden. Kannst du verraten, wo du diesen Code herhast, damit ich demjenigen mal kurz Manieren von 2011 beibringen kann?

      Bitte ersetze es mit:

        
          use CGI qw();  
          my $cgi = CGI->new;  
          my @values = $cgi->param('foo'); # Werte für Formfeld mit dem Namen foo  
      
      
    3. Hier noch der Scriptcode:
      $in{$name} = $value; # Wie hier "my" platzieren?

      Abgesehen von (wahrscheinlich) Tippfehlern, hat der Code den entscheidenden Mangel, dass im Fall von mehreren name-Attributen nur ein Wert geliefert wird (name-Attribut als key im Hash). Wenn Du also mehrere Formfelder mit gleichem Namen hast oder multiple-Selects, gehen Dir damit diese Werte verloren.

      Das Perlmodul CGI.pm gibts schon lange. Daran ist nichts zu verbessern, param() ist ein Parser, der überdies auch mit mutlipart/form-data klarkommt (File-Upload) und auch ein Array liefert, wenn es mehrere Attribute mit gleichem Namen gibt. use CGI; # und alles wird gut, strict und warnings nicht vergessen.

      Neuere Versionen von CGI.pm (ab v3.28) können außerdem UTF-8-kodierte Eingaben gleich taggen, so dass damit Stringfunktionen wie substr(), uc() usw. möglich werden und wenn Dein CGI mit einer DB komplett utf8 reden soll, musst Du das sowieso machen.

      Hotti

      PS: Falls Du die OO-Api nicht brauchst,

        
      use CGI 'param';  
      if(param('name')){} # usw.  
      
      
      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.