Stefan: Subroutinen mit 2 Listen als Parameter aufrufen

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

  1. 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

    1. 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

  2. Arbeite doch mit Referenzen auf diese Listen

    Gruß
    Timothy

    1. 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

      1. 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