Thread Array - anonym oder benannt? (14 answers)
Opened by hugenyn at 2011-02-26 00:20

Linuxer
 2011-02-27 00:28
#146089 #146089
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
2011-02-26T21:09:33 hugenyn
Ich fasse mal zusammen, wie ich die Antworten verstanden habe:

Ein anonymes Array kann man verwenden, wenn in einer Sub via @_ das Original verändert werden soll/darf.


Nein, meiner Meinung nach hast Du das falsch verstanden.
@_ enthält Aliase auf die übergebenen Argumente. Wenn Du Werte in @_ veränderst, veränderst Du die originalen Werte oder bekommst entsprechende Fehler/Warnungen. Das ist vollkommen losgelöst davon, ob Du eine Referenz auf ein benanntes oder anonymes Array übergibst. Du kannst auch eine Liste von Skalaren übergeben und diese über @_ verändern.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /usr/bin/perl -l
use strict;
use warnings;

sub exchange_values {
    # tausche inhalte  des ersten und zweiten elements mit Hilfe des @_ (Alias)
    @_[0,1] = @_[1,0];
}

my $hello = 'World!';
my $world = 'Hello ';

# kontrolle; so ist's jetzt
print $hello, $world;

exchange_values( $hello, $world );

# ups; das war eben noch anders
print $hello, $world;



Quote
Ansonsten übergibt man der Sub ein benanntes Array. In diesem Fall verändert die Manipulation in @_ das Original nicht.

Falsch, siehe oben. Wenn Du die Originale nicht verändern willst, musst Du @_ oder Teile davon kopieren!

Code (perl): (dl )
1
2
3
4
sub foo ( 
  # originale sind sicher; wir kopieren die Inhalte
  my ( $anton, $berta ) = @_;  
}


Quote
Ein verändertes @_ gibt man bei Bedarf per Return an ein anderes Array zurück.

Technisch geht das schon; aber ich glaube [edit3]immer noch, dass auch hier [/edit3] der Mechanismus falsch verstanden wird.
Ich wiederhole nochmal: @_ arbeitet über einen Alias-Mechanismus; Änderungen an @_ verändern das Original.
Wenn Du Werte kopierst und veränderst, dann musst Du die veränderten Werte mit return() zurückgeben, damit Du damit weiter arbeiten kannst.
Technisch kannst Du sehr wohl return @_; verwenden, aber sei Dir im klaren, dass dies über die Aliase in @_ auf die originalen Daten zurückgreift (die Du u.U. vorher via @_ geändert hast).

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub exchange_words {
  # kopiere die Werte in eigene Variablen
  my ( $word1, $word2 ) = @_;

  # Woerter tauschen
  ( $word1, $word2 ) = ( $word2, $word1 );

  # gebe die veraenderten Werte zurueck
  return ( $word1, $word2 );
}

my ($hello, $world) = exchange_words( 'world!', 'hello ' );

print $hello, $world;


Quote
Das anonyme Array wäre folglich nur für die Arbeit mit Subs von Vorteil.

Ich finde diesen Satz so auch nicht korrekt. Was ist für Dich denn ein anonymes Array?
Erkennst Du den Unterschied zwischen my @arr = (1,2); foo( \@arr ); und my @arr = (1,2); foo( [@arr] ); und foo( [1,2] );? Kannst Du mir den Unterschied erklären?


Quote
Hoffentlich richtig verstanden.

Siehe oben. Ich fürchte, nicht richtig verstanden ;)

Ich habe den Eindruck, dass hier eine Vermischung von "anonymen Arrays" und Referenzen auf Arrays herrscht.

Ich rate auch davon ab, "anonymes Array" als Synonym für "Array-Referenz" zu verwenden. Es ist IMHO schlichtweg falsch. Ich würde auch keine "Übersetzung" machen und diese implizit vornehmen.

edit(1+2):
Lesenswerte Dokumentation zu dem Thema:

# Referenzen
http://perldoc.perl.org/perlreftut.html
http://perldoc.perl.org/perlref.html

# Subroutinen
http://perldoc.perl.org/perlsub.html
Last edited: 2011-02-27 00:57:51 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Array - anonym oder benannt?