Tom: Aufruf von Elementen in einem Array

Hi,

in einigen Perl-Scripts werden Elemente eines Array mit

$arrayname[0]

aufgerufen.
In anderen Perl-Scripts wiederum steht

@arrayname[0]

Gibt es da einen Unterschied oder ist es grundsätzlich egal, was ich verwende?

Danke

Tom

  1. Hallo Tom

    in einigen Perl-Scripts werden Elemente eines Array mit

    $arrayname[0]

    aufgerufen.
    In anderen Perl-Scripts wiederum steht

    @arrayname[0]

    Gibt es da einen Unterschied oder ist es grundsätzlich egal, was ich verwende?

    Ich würde sagen, dass $arrayname[0] den ersten Skalar in der Liste @arrayname zurückgibt,  @arrayname[0] aber die erste Liste in der Liste @arrayname, also $arrayname[0][0] bis $arrayname[0][-1].

    Gruss
    Andreas

    1. Hi!

      $arrayname[0]
      @arrayname[0]

      Gibt es da einen Unterschied oder ist es grundsätzlich egal, was ich verwende?

      Ich würde sagen, dass $arrayname[0] den ersten Skalar in der Liste @arrayname zurückgibt,  @arrayname[0] aber die erste Liste in der Liste @arrayname, also $arrayname[0][0] bis $arrayname[0][-1].

      Dazu muesste man schreiben @{$arrayname[0]}.

      @arrayname[0] wird genauso wie $arrayname[0] interpretiert, hat man aber den -w switch an, dann erhaelt man die Warnung "Scalar value @arrayname[0] better written as $arrayname[0] at - line 2.". So sieht es zumindest nach einem Test aus. Wie Perl offiziell dazu steht, weiss ich nicht, aber ich wuerde sagen, die Schreibweise @arrayname[0] sollte man auf jeden Fall vermeiden.

      Bye, Calocybe

  2. Hallo Tom,

    in einigen Perl-Scripts werden Elemente eines Array mit
    $arrayname[0]
    aufgerufen.
    In anderen Perl-Scripts wiederum steht
    @arrayname[0]
    Gibt es da einen Unterschied oder ist es grundsätzlich egal, was ich verwende?

    Die Schreibweise @arrayname[Zeile] ist eigentlich dafuer da, um in einem mehrdimensionalen Array eine ganze Zeile zu uebergeben. Zum Beispiel so:

    @arrayname = (['a', 'b', 'c'], ['d', 'e', 'f']);

    @test1 = @{@arrayname[0]};
    print "test1 = @test1\n";
    @test2 = @{@arrayname[1]};
    print "test2 = @test2\n";

    ergibt die Ausgabe:
    test1 = a b c
    test2 = d e f

    Das ist die direkteste Moeglichkeit, um sich auf eine ganze Zeile zu beziehen.

    Viele Gruesse

    Beate Mielke

    1. Hallo Beate

      @arrayname = (['a', 'b', 'c'], ['d', 'e', 'f']);

      @test1 = @{@arrayname[0]};
      print "test1 = @test1\n";
      @test2 = @{@arrayname[1]};
      print "test2 = @test2\n";

      ergibt die Ausgabe:
      test1 = a b c
      test2 = d e f

      Dann schalte mal den -w switch an. Ergibt die Ausgabe:
      Scalar value @arrayname[0] better written as $arrayname[0] at array.pl line 5.
      Scalar value @arrayname[1] better written as $arrayname[1] at array.pl line 7.
      test1 = a b c
      test2 = d e f

      Alles weitere in meiner anderen Antwort in diesem Thread.

      So long

      1. Hallo Roland,

        Dann schalte mal den -w switch an. Ergibt die Ausgabe:
        Scalar value @arrayname[0] better written as $arrayname[0] at array.pl line 5.
        Scalar value @arrayname[1] better written as $arrayname[1] at array.pl line 7.
        test1 = a b c
        test2 = d e f

        Hast recht. Uebrigens kennst Du einen aehnlichen Ausdruck wie diesen

        @test1 = @{$arrayname[0]};

        um aus einem zweidimensionalen Array eine Spalte auszugeben? Ich meine ohne Schleife, als einfachen Ausdruck wie hier bei der Zeilenausgabe.

        Viele Gruesse

        Beate

        1. Hallo Beate!

          Um Deine jetzige Frage zu beantworten, habe ich gerade mal in eine der Perl FAQs geschaut, und hab dort doch noch eine Antwort auf die urspruengliche Frage gefunden: http://www.activestate.com/activeperl/docs/lib/Pod/perlfaq4.html#What_is_the_difference_between_. Der Unterschied zwischen $arrayname[0] und @arrayname[0] ist, dass ersteres einen normalen skalaren Wert darstellt, das zweite jedoch eine Liste mit einem einzigen Element (naemlich eben dem Skalar). Da der zweite Anwendungsfall aber in Praxis fast nie vorkommt, wird man durch -w vor einem eventuellen Syntaxfehler gewarnt.

          Hast recht. Uebrigens kennst Du einen aehnlichen Ausdruck wie diesen
          @test1 = @{$arrayname[0]};
          um aus einem zweidimensionalen Array eine Spalte auszugeben? Ich meine ohne Schleife, als einfachen Ausdruck wie hier bei der Zeilenausgabe.

          Dazu habe ich aber leider nichts gefunden. Falls es sich nur um eine sehr kleine Matrix handelt, kannst Du z.B. mit

          @test4 = ($$arrayname[0][$s], $$arrayname[1][$s], $$arrayname[2][$s], $$arrayname[4][$s]);

          alle Elemente eigenhaendig hinschreiben ($s ist die Spaltennummer). Ansonsten scheint wohl wirklich nur die Schleife zu bleiben:

          for (@arrayname) { push(@test4, $_->[$s] }      # oder:
              for (@arrayname) { push(@test4, ${$_}[$s] }

          Mehr weiss ich auch nicht.

          Bis dann, Roland

          1. Hallo Roland

            Der Unterschied zwischen $arrayname[0] und @arrayname[0] ist, dass ersteres einen normalen skalaren Wert darstellt, das zweite jedoch eine Liste mit einem einzigen Element (naemlich eben dem Skalar). Da der zweite Anwendungsfall aber in Praxis fast nie vorkommt, wird man durch -w vor einem eventuellen Syntaxfehler gewarnt.

            Fragt sich nur, WANN dieser  Praxisfall mal eintritt, schon merkwuerdig.

            Uebrigens kennst Du einen aehnlichen Ausdruck wie diesen

            @test1 = @{$arrayname[0]};
            um aus einem zweidimensionalen Array eine Spalte auszugeben? Ich meine ohne Schleife, als einfachen Ausdruck wie hier bei der Zeilenausgabe.

            @test4 = ($$arrayname[0][$s], $$arrayname[1][$s], $$arrayname[2][$s], $$arrayname[4][$s]);

            Ich glaube, hier muessen die zwei $$ durch ein $ ersetzt werden.

            for (@arrayname) { push(@test4, $_->[$s] }      # oder:
                for (@arrayname) { push(@test4, ${$_}[$s] }

            Das funktioniert leider nicht, gibt schon Fehlermeldungen beim Compilieren.

            Mehr weiss ich auch nicht.

            Macht nichts, ich glaube, es gibt tatsaechlich nur die Schleife als Loesung. Ich habe gerade auch noch eine Menge Kombinationen ausprobiert.

            Viele Gruesse

            Beate

            1. Hi again!

              @test4 = ($$arrayname[0][$s], $$arrayname[1][$s], $$arrayname[2][$s], $$arrayname[4][$s]);

              Ich glaube, hier muessen die zwei $$ durch ein $ ersetzt werden.

              Stimmt.

              for (@arrayname) { push(@test4, $_->[$s] }      # oder:
                  for (@arrayname) { push(@test4, ${$_}[$s] }

              Das funktioniert leider nicht, gibt schon Fehlermeldungen beim Compilieren.

              Mmh ja, die ) vom push fehlt. ;-)

              for (@arrayname) { push(@test4, $_->[$s]) }      # oder:
                  for (@arrayname) { push(@test4, ${$_}[$s]) }

              So long