Claus: global, lokal, egal/katastrophal?

Hi,
ich bin am Verzweifeln.
Ich hatte ursprünglich die notwendigsten Variablen zu Beginn des Programms mit my (...); definiert, die übrigen in den Subroutinen.
Immer wieder traten Fehler auf, die dadurch behoben wurden, dass ich
die zu Beginn des Programms mit my definierten Variable mit use vars qw(....); definierte.
Jetzt habe ich ein Mix aus "my-def."- und "use"-definierten Variablen.
Mir ist auch nach Lesen der Beschreibung nicht klar, warum einmal my genügt zum andern aber nicht.
Ich sehe keinen Unterschied in der Verwendung der Variablen.
Das ganze Programm zu posten, wäre unsinnig.
Vielleicht kann mir jemand schon anhand der Schilderung einen Tipp geben.

Ich habe folgende Struktur:

  
#!/usr/bin/perl -w  
use strict;  
use warnings;  
my ($Rechner_IP);  
  
sub kontakt()  
  {....  
   }  
  
....  
  
sub bestaetigungsausgabe()  
  {....  
  }  
  
  
###############################################################################################################  
#                                Hauptprogramm  
###############################################################################################################  
  
use CGI;  
use CGI::Carp qw(fatalsToBrowser);  
  
$Rechner_IP  = $ENV{REMOTE_ADDR};  
  
....  
  
  

Die Variable $Rechner_IP wird in verschiedenen Subroutinen angesprochen und ist bis auf eine Stelle immer mit dem korrekten Wert vorhanden.
Sie ist auch nicht ein zweites Mal definiert.
Sobald ich sie mit "use vars qw($Rechner_IP);" definiere, ist sie überall vorhanden.

  1. Vielleicht kann mir jemand schon anhand der Schilderung einen Tipp geben.

    nicht wirklich.

    Die Variable $Rechner_IP wird in verschiedenen Subroutinen angesprochen und ist bis auf eine Stelle immer mit dem korrekten Wert vorhanden.

    Was unterscheidet die ein von den anderen Stellen?

    Sie ist auch nicht ein zweites Mal definiert.
    Sobald ich sie mit "use vars qw($Rechner_IP);" definiere, ist sie überall vorhanden.

    Ehrlich gesagt ich weiß nicht was use vars macht, da ich das noch nie verwenden musste, bei mir reichte bisher immer my.

    Struppi.

    1. Hallo Struppi!

      Ehrlich gesagt ich weiß nicht was use vars macht, da ich das noch nie verwenden musste, bei mir reichte bisher immer my.

      use vars erlaubt Dir beim strict-Pragma, doch noch globale Variablen zu deklarieren. Sollte, meine ich gelesen zu haben, nicht mehr verwendet werden - zwar nicht deprecated aber unelegant. Der Formmailer von Source Forge, den ich einsetze, hat so zu Script-Beginn eine Reihe von Variablen global deklariert:

      use vars qw(
        $DEBUGGING $emulate_matts_code $secure
        $allow_empty_ref $max_recipients $mailprog @referers
        @allow_mail_to @recipients %recipient_alias
        @valid_ENV $date_fmt $style $send_confirmation_mail
        $confirmation_text $locale $charset $no_content @config_include
        $wrap_text $wrap_style);

      Warum aber Claus nicht gleich zu Script-Beginn die use-Deklarationen notiert, und auch gleich hinterher, wenn er's denn global braucht:

      my $Rechner_IP  = $ENV{REMOTE_ADDR};

      weiß ich nicht. Den Sinn, es so zu notieren, sehe ich eh nicht, ist ja keine Liste:

      my ($Rechner_IP);

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      Nichts ist unmöglich? Doch!
      Heute schon gegökt?
      1. Nachtrag:

        Ich zitiere »Programming mit Perl«, Seite 886 - Pragma Module - use vars:

        ------------------------------------
        use vars qw($frobbed @munge %seen);

        Dieses Pragma, das früher zur Deklaration globaler Variablen verwendet wurde, gilt heute als ein wenig veraltet. Heutzutage wird der Modifier our bevorzugt. Die vorige Deklaration ist wie folgt besser zu erreichen:

        our($frobbed @munge %seen);

        Auch das ist möglich:

        our $frobbed = "F";
        our @munge = "A"..$frobbed;
        our %seen = ();

        Unabhängig davon, welche Lösung Sie wählen, müssen Sie daran denken, dass es sich um Variablen handelt, die innerhalb des Pakets global sind, nicht um lexikalische Variablen, die auf Dateien beschränkt sind.
        -------------------------------------

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        1. Dieses Pragma, das früher zur Deklaration globaler Variablen verwendet wurde, gilt heute als ein wenig veraltet. Heutzutage wird der Modifier our bevorzugt. Die vorige Deklaration ist wie folgt besser zu erreichen:

          Wobei nach http://de.wikibooks.org/wiki/Perl-Programmierung:_Gültigkeitsbereich_von_Variablen beide nicht die gleiche Wirkung haben.
          Gruß
          Claus

          1. Hallo Claus!

            Wobei nach http://de.wikibooks.org/wiki/Perl-Programmierung:_Gültigkeitsbereich_von_Variablen beide [our, use vars] nicht die gleiche Wirkung haben.

            Ja, aber nur dann, wenn eine mit our deklarierte Variable innerhalb eines Blocks zum ersten Mal deklariert wird. Da hat sie - wie my - nur Gültigkeit innerhalb dieses einen Blocks (siehe $hundehuette im Beispiel).

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?