Seite 1 von 1

[perl] var => sub übergeben

Verfasst: 17.11.2004, 13:43
von csm
hüüüülfe ;) 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

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:

Code: Alles auswählen

function blah(param1, param2) {
    ...
}
Und in Perl beispielsweise:

Code: Alles auswählen

sub blah {
    my ($param1, $param2) = @_;

    ...
}

Verfasst: 17.11.2004, 14:48
von palandir
Achja, und verwechsle nicht bspw. $_[0] mit $_ ;)
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. ;)

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 :) @_ und $_ hätte ich schon nicht verwechselt ;)