Thread Variablen/Objekte an Funktionen übergeben (3 answers)
Opened by Kean at 2013-06-20 14:27

renee
 2013-06-20 17:30
#168512 #168512
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Man sollte Referenzen übergeben, gerade damit die Sachen nicht doppelt im Speicher liegen.

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
36
37
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @array = (1..3);
test(@array);

print Dumper \@array;

test_ref(\@array);

print Dumper \@array;

sub test {
my (@values) = @_; # erzeugt kopie von @array,
# also doppelt im Speicher

$values[1] = 9;

print Dumper \@array;

$_[2] = 5; # Mit $_[...] greift man auf
# das Original-Array zu

print Dumper \@array;
}

sub test_ref {
my ($array_ref) = @_; # kopie der referenz, die Werte im
# Array gibt's aber nur einmal

$array_ref->[2] = 6; # verändert Wert in @array

print Dumper \@array;
}


Ausgabe:
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
$VAR1 = [
1,
2,
3
];
$VAR1 = [
1,
2,
5
];
$VAR1 = [
1,
2,
5
];
$VAR1 = [
1,
2,
6
];
$VAR1 = [
1,
2,
6
];


Es gibt natürlich Fälle, in denen man auf Referenzen verzichten sollte (wenn man "Angst" hat, dass etwas an den Originaldaten verändert werden könnte).

Wenn im Array Referenzen gespeichert werden, werden diese nie kopiert:

Code: (dl )
1
2
3
4
5
6
7
8
my @array = ([1,2,3],[4,5,6]);
test(@array);

sub test {
my @values = @_;

$_[0]->[2] = 5; # Originaldaten werden verändert
]

Last edited: 2013-06-20 17:33:16 +0200 (CEST)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Variablen/Objekte an Funktionen übergeben