Gültigkeitsbereich von Variablen
Klaus
- perl
Hallo,
in dem nachfolgenden Programm1 ist in der Unterroutine die Variable "fehlerausgabe" vorhanden und korrekt.
Programm1:
#!/usr/bin/perl -w
use strict;
my ($sprache, $query);
sub fehlerausgabe {
print "\$sprache=$sprache *";
exit ($_[2]);
}
sub erstaufruf
{fehlerausgabe("p1")}
use CGI;
use CGI::Carp qw(fatalsToBrowser);
print "Content-type: text/html\n\n";
my $query = new CGI;
$sprache="f";
erstaufruf();
Wenn ich die Routine wie im Programm2 auslagere, so ist die Variable "fehlerausgabe" nicht vorhanden., warum?
Programm2:
#!/usr/bin/perl -w
use strict;
my ($sprache, $query);
use fehlerausgabe;
sub erstaufruf
{fehlerausgabe("p1")}
use CGI;
use CGI::Carp qw(fatalsToBrowser);
print "Content-type: text/html\n\n";
my $query = new CGI;
$sprache="f";
erstaufruf();
fehlerausgabe.pm
sub fehlerausgabe {
# print "\$sprache=$sprache *";
# exit ($_[2]);
# }
1\.
in dem nachfolgenden Programm1 ist in der Unterroutine die Variable "fehlerausgabe" vorhanden und korrekt. [...] Wenn ich die Routine wie im Programm2 auslagere, so ist die Variable "fehlerausgabe" nicht vorhanden., warum?
Du meinst die Subroutine. Wenn du eine Sub ansprechen willst, die nicht zum Namensraum des aufrufenden Scriptes gehört, musst du den Namensraum nennen:
use Foo;
Foo::bar('baz');
fehlerausgabe.pm
sub fehlerausgabe {
# print "$sprache=$sprache *";
# exit ($_[2]);
# }
Und so wird das nix. Du deklarierst $sprache im Hauptskript, damit ist diese Variable in fehlerausgabe.pm nicht existent, wenn du sie nicht explizit übergibst. Zudem musst du deinem Package einen Namen geben, um Zugriff auf die Subroutinen dieses Paketes zu erhalten:
~~~perl
package Fehlerausgabe;
use strict;
sub Ausgabe {
print shift;
}
1;
Im Einsatz:
use strict;
use Fehlerausgabe;
my $var = 'foo';
Fehlerausgabe::Ausgabe($var);
Es gibt noch solche schönen Sachen wie den Exporter, Beispiele gibt's in SELFHTML. Ansonsten gäbe es da auch noch do.
Siechfred
Warum muss ich ein package daraus machen?
Bisher habe ich alle subroutinen als pm-Module abgespeichert - ohne Probleme (bis auf das jetzige).
Wie ich aber gerade festgestellt habe, funktioniert es korrekt mit
use vars qw ($sprache); anstelle von my $sprache;
Warum?
Beides ist doch eine globale Definition oder irre ich mich da?
Bisher habe ich alle subroutinen als pm-Module abgespeichert - ohne Probleme (bis auf das jetzige).
Das halte ich für übertrieben, Module sind Sammlungen von Funktionen, sinnvollerweise in einem package
Wie ich aber gerade festgestellt habe, funktioniert es korrekt mit
use vars qw ($sprache); anstelle von my $sprache;
Warum?
Beides ist doch eine globale Definition oder irre ich mich da?
Ja du irrst, my deklariert eine Variabel im aktuellen Geltungsbereich oder Datei, du könntest auch our verwenden. Dürfte aber bei dem bisherigen Konzept zu umständlich sein, wenn du überall alle Variabeln mit our deklarieren musst.
Struppi.
Ja du irrst, my deklariert eine Variabel im aktuellen Geltungsbereich oder Datei, du könntest auch our verwenden. Dürfte aber bei dem bisherigen Konzept zu umständlich sein, wenn du überall alle Variabeln mit our deklarieren musst.
Aber ist
use fehlerausgabe;
nicht gleichbedeutend mit Angabe der entsprechenden Zeilen im Programm (wie oben dargestellt).
So wurde es mir zumindest verkauft.
Aber ist
use fehlerausgabe;
nicht gleichbedeutend mit Angabe der entsprechenden Zeilen im Programm (wie oben dargestellt).
http://perldoc.perl.org/functions/use.html
So wurde es mir zumindest verkauft.
ich hoffe du hast nichts bezahlt dafür.
Struppi.