Subroutinen mit 2 Listen als Parameter aufrufen
Stefan
- perl
0 Eidgenosse0 Stefan
0 timothy
Hallöchen,
mich plagt mal wieder ein Problem in Perl und ich hoffe mal wieder auf eure Hilfe!!
Ich versuche eine Subroutine mit 2 Listen als Parameter aufzurufen.
funktion(@liste1,@liste2)
...
sub funktion
{
my localListe1 = @_; # liefert mir beide Listen als eine ganze Liste!
my localListe2 = @_[0]; # liefert mir nur das erste Element der
...
}
Ich möchte aber beide Listen getrennt in meiner Subroutine bekommen!
In der PerlDoc steht unter PerlSub folgendes dazu:
Do not, however, be tempted to do this:
(@a, @b) = upcase(@list1, @list2);
Kann mir jemand weiterhelfen?? Ist mein Wunsch überhaupt realisierbar? Wenn ja wie?
danke für eure Hilfe
Stefan
Hallo Stefan,
Du kannst ihm die Längen der beiden Listen mitgeben (Kode ungetestet!).
@liste1 = (1,2,3);
@liste2 = ('A','B','C');
funktion(scalar(@liste1),@liste1,scalar(@liste2),@liste2);
sub funktion
{
my @int=splice(@_,0,shift);
my @char=splice(@_,0,shift);
}
Gruß
Eidgenosse
Hi Eidgenosse,
Du kannst ihm die Längen der beiden Listen mitgeben (Kode ungetestet!).
klingt vielversprechend, wenn es nicht noch eine einfachere Methode gibt (was ich im Moment nicht glaube) werde ich das genauso machen.
Dankeschön für deine Hilfe
Stefan
Arbeite doch mit Referenzen auf diese Listen
Gruß
Timothy
Hi Timothy,
Arbeite doch mit Referenzen auf diese Listen
daran hab ich auch schon gedacht, aber dann würd ich in der Funktion mit den orginalen Listen arbeiten, oder ich mache mir davon Kopien....mhm. Na mal schaun, der Vorschlag ist jedenfalls auch nicht schlecht!
dir auch ein Dankeschön
Stefan
daran hab ich auch schon gedacht, aber dann würd ich in der Funktion mit den orginalen Listen arbeiten, oder ich mache mir davon Kopien....mhm.
Richtig
<snippet> aus dem Perl-Cookbook
Problem
You want to pass a function more than one array or hash and have each remain distinct. For example, you want to put the "Find elements in one array but not in another" algorithm from Recipe 4.7 in a subroutine. This subroutine must then be called with two arrays that remain distinct.
Solution
Pass arrays and hashes by reference, using the backslash operator:
array_diff( @array1, @array2 );
Discussion
See Chapter 11, References and Records, for more about manipulation of references. Here's a subroutine that takes array references and a subroutine call that generates them:
@a = (1, 2);
@b = (5, 8);
@c = add_vecpair( @a, @b );
print "@c\n";
6 10
sub add_vecpair { # assumes both vectors the same length
my ($x, $y) = @_; # copy in the array references
my @result;
for (my $i=0; $i < @$x; $i++) {
$result[$i] = $x->[$i] + $y->[$i];
}
return @result;
}
A potential difficulty with this function is that it doesn't check to make sure it got exactly two arguments that were both array references. You could check explicitly this way:
unless (@_ == 2 && ref($x) eq 'ARRAY' && ref($y) eq 'ARRAY') {
die "usage: add_vecpair ARRAYREF1 ARRAYREF2";
}
If all you plan to do is die on error (see Recipe 10.12), you can usually omit this check, since dereferencing the wrong kind of reference triggers an exception anyway.
</snippet>
Bye
Timothy