Seite 1 von 1
[perl] var => sub übergeben
Verfasst: 17.11.2004, 13:43
von csm
hüüüülfe
![Wink ;)](./images/smilies/wink.gif)
ich verstehe die doku einfach nicht.
ich habe im sub "apache" eine variable:
my $httpdconf;
und das, was da drin steht, würde ich gerne im sub "vhost" auslesen.
bekomme ich nicht hin :/ @_ $_ << k.a.
![Bild](http://www.mediengestalter.info/images/smiles/icon_whoknows.gif)
Verfasst: 17.11.2004, 14:42
von palandir
Hm?
Also Variablen die du mit "my" deklarierst sind lokal zu ihrem entsprechenden Block. Wenn du eine Funktion hast sub func { my $a = 1; } dann existiert $a außerhalb dieser Funktion nicht. Wenn du auf eine Variable aus mehreren Funktionen zugreifen willst, dann schreibst du sie z.B. außerhalb hin:
Code: Alles auswählen
my $httpdconf;
sub func1 {
$httpdconf = '/etc/apache/httpd.conf';
print "$httpdconf\n";
}
sub func2 {
print "$httpdconf\n";
}
Oder du benutzt "echte" globale Variablen (our $FOO = 1;), aber sollte man nur nehmen wenn unbedingt nötig, und das ist fast nie.
Oder du übergibst die Variable der entsprechenden Funktion:
Code: Alles auswählen
sub func1 {
my $httpdconf = 'ich bin nur für func1 lesbar';
func2($httpdconf);
}
sub func2 {
# Macht alles fast das gleiche:
my $httpdconf = shift; # aus Array @_ erstes Element entfernen (ist dann nur noch in $httpdconf vorhanden!)
#my $httpdconf = $_[0] # erstes Element von Array @_ kopieren
#my ($httpdconf) = @_; # Im Listenkontext erstes Element von Array @_ kopieren
print "$httpdconf\n";
}
Oder du machst es objektorientiert. ;)
Noch zur Erklärung: @_ ist das Array welches die Funktionsparameter enthält. Der Vorteil ist eben, dass eine Funktion dadurch beliebig viele Parameter erhalten kann.
In anderen Programmiersprachen macht man:
Und in Perl
beispielsweise:
Verfasst: 17.11.2004, 14:48
von palandir
Achja, und verwechsle nicht bspw. $_[0] mit $_
![Wink ;)](./images/smilies/wink.gif)
Das erste ist einfach das erste Element vom Array @_, das zweite ist die Perl-"Defaultvariable". Viele Funktionen greifen auf $_ zurück, wenn keine Variable übergeben wurde.
Z.B.:
Code: Alles auswählen
$_ = 'test';
print if length; # print($_) if length($_); --> gibt $_ aus, wenn es Zeichen enthält
Das ist cool.
![Wink ;)](./images/smilies/wink.gif)
Verfasst: 17.11.2004, 14:57
von csm
Juar, hab's jetzt eh schon hinbekommen - muss mich trotzdem noch näher damit befassen - Vielen Dank jedenfalls
![Smile :)](./images/smilies/smile.gif)
@_ und $_ hätte ich schon nicht verwechselt
![Wink ;)](./images/smilies/wink.gif)