2012-05-23 4 views
22

Mögliche Duplizieren: How do pass one array and one string as arguments to a function?Pass-Array und Skalar zu einer Perl-Subroutine

I eine Funktion habe, oder ein Unterprogramm, das als ein Array in dem ersten Parameter nimmt und den zweiten Parameter als ein Skalar. Zum Beispiel

sub calc { 
    my @array = $_[0]; 
    my $scalar = $_[1]; 
    print @array, $scalar; 
} 

Das Problem ist, dass die Funktion auf den ersten Wert des Arrays besteht in der Anordnung gleich macht, und die skalare der zweite Wert des Arrays in übergeben zu werden. Wenn ich die ersten will Array, um das gesamte Array zu sein, muss ich keine tiefe Kopie des Arrays erstellen. Zum Beispiel

my @array = ('51', 'M'); 
my $scalar = 21; 

und

calc(@array, $scalar) 

drucken 51 M wenn ich 51 M 21 will.

Antwort

42

Sie müssen es passieren in als Referenz:

calc(\@array, $scalar)

Und dann greifen sie als: my @array = @{$_[0]};

+3

Beachten Sie, dass der zweite Teil meiner Antwort eine Kopie des Arrays erstellen wird. Sie könnten es auch als Referenz belassen und in Ihrer Funktion entsprechend darauf zugreifen. – happydave

+0

Das funktioniert allerdings nicht, ich habe es ausprobiert. Hast du das getestet? –

+0

Sorry, ich denke, dass @ vor dem [0] angewendet wird. Ich habe eine feste Version mit Klammern um das $ _ [0] gelegt. – happydave

2

Die Argumentliste in einer Perl-Subroutine ist einfach ein flacher Array. Wenn Sie ein bestimmtes Array übergeben möchten, müssen Sie es als Array-Referenz übergeben.

8

Sie einen Verweis auf das Array an die Funktion übergeben können:

calc(\@array, $scalar); 

Wenn Sie auf Elemente von @array in Ihrer Subroutine zugreifen müssen, können Sie es wie folgt tun:

my $array = $_[0]; 

# access first element of array 
print $array->[0]; 

Edit: Da dies eine Referenz auf das Original-Array ist, werden alle Änderungen, die in der Subroutine vorgenommen wurden, im ursprünglichen Array widergespiegelt.

+2

Cool, ich wusste, es war ein Syntaxproblem, danke! –

+0

@Dan, Es war kein Syntaxfehler. Das Problem ist, dass Sie nicht verstanden haben, dass die Argumentliste eines Unteraufrufs als ein Ausdruck ausgewertet wird und nicht als eine Folge von durch Kommas getrennten Ausdrücken. – ikegami

+1

Nun, ich dachte mir das aus, also würde ich sagen, dass ich anderer Meinung bin. Ich wusste einfach nicht, wie ich Perl sagen sollte, dass ich ein Array durchlasse. –

9

Fahren Sie mit Array auf die Calc-Unterprogramm als Array ref:

calc(\@array, $scalar); 

Dann in Ihrem calc Unterprogramm, initialisieren Sie Ihre Eingabeparameter wie folgt aus:

sub calc { 
    my($array_ref, $scalar) = @_; 

    foreach my $item (@$array_ref) { 
    # process each item in the array ref 
    } 
} 
12

entweder einen Verweis auf die Verwendung Array als das erste Argument, oder umgekehrt die Argumente, so dass der Skalar zuerst ist und das Array kommt danach:

Versuchen Sie nicht Perlprototypes (zwei Artikel, einer auf Stack   Überlauf, einer auf PerlMonks).

+0

Was ist der Grund, nicht zu versuchen, Prototypen zu verwenden? –

+0

Die kürzeste Form ist "Verwenden Sie keine Perl-Prototypen"; Das nächstkürzeste Formular ist "Perl-Funktionsprototypen funktionieren nicht so, wie Sie es erwarten, und die Experten empfehlen, dass Sie nicht versuchen, sie zu verwenden". Die langatmige Version läuft ungefähr so ​​ab wie "Perl-Prototypen sind ein gescheitertes Experiment, das mehr Trauer und Bestürzung hervorruft als nützliche Hilfe bei der Anwendung, was zu schwer zu diagnostizierenden Problemen führt - auf diesem Weg liegt Verzweiflung und Wahnsinn". –

Verwandte Themen