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

BernhardSchmalhofer
 2011-02-26 17:12
#146076 #146076
User since
2009-03-26
56 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dubu hat alles ganz richtig gesagt, aber um die Verwirrung zu minimieren sollte man ein bisschen weiter ausholen.

Beim Aufruf einer Subroutine wird immer eine Liste übergeben. Bei
Code: (dl )
perl -w -MData::Dumper -e '@a=[1,2,{1=>{2=>"i"}}]; sub abc{print Dumper \@_ }; abc(@a)';

wird zum Beispiel eine Liste mit den Elementen von @a übergeben. @a enthält als einziges Element eine Referenz auf einen Array. Also wird im Endeffekt eine Referenz auf einen Array übergeben.

Innerhalb der Subroutine sind die übergebenen Parameter über den Array @_ verfügbar. Die Elemente von @_ sind dabei Aliase auf die übergebenen Parameter. Ist ein Parameter modifizierbar, dann kann in der Sub etwas im Kontext das Aufrufers ändern. Wird versucht etwas konstantes zu ändern, so meckert perl das an.

Das Modifizieren der Parameter ist meistens unerwünscht. Deshalb kopiert man in der Subroutine oft um.

Wird eine Referenz übergeben so kann die referenzierte Datenstruktur geändert werden.

Beispiele:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use strict;
use warnings;

use Data::Dumper;

# the first arg will modified
sub square_first_arg {
$_[0] = $_[0]** 2;
}

my $x = 2;
square_first_arg($x);
print "2 squared is $x\n";

eval {
square_first_arg( 3 );
};

print "trying to square something unmodifyable: $@ \n";

# Referenzen

my $a = 'A';

sub a_to_b {
# copy @_, as we dont't want to modify the the param itself
my ($first_param) = @_;

# modify the scalar that $first_param refers to
${ $first_param } = 'B';
}

print Dumper( $a );
a_to_b( \$a );
print Dumper( $a );

View full thread Array - anonym oder benannt?