Thread Korrekter Code? (7 answers)
Opened by bianca at 2011-04-09 20:28

rosti
 2011-04-09 21:02
#147516 #147516
User since
2011-03-19
3472 Artikel
BenutzerIn
[Homepage]
user image
hi,

ein Hash lebt solange, wie es Referenzen darauf gibt. Sofern Deine sub den Hash verändern soll, bietet es sich an, eine Referenz zu übergeben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my %h = (
  1 => 'foo',
  2 => 'bar',
);

f(\%h);

sub f{
  my $ref = shift;
  $ref->{1} = 'otto';
  return 'egal';
}

print $h{1}; # otto


Der Hash lebt bis zum Ende der main(), daran ändert auch ein undef $ref innerhalb der sub f{} nichts. Erst wenn Du in der main() ein

Code (perl): (dl )
undef %h;


notierst, ist der Hash vor dem Ende der main() tot.

Übergibst Du hingegen den Hash selbst an die sub, hast Du in der sub eine Kopie davon. Es kann von Vorteil sein, einen hash zu übergeben, insbesondere dann, wenn Keys vorbelegt werden sollen mit Default-Werten:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
fx(%ENV);

sub fx{
  my %args = (
    foo => 1,
    bar => 2,
    baz => 'default',
    @_
  );
  print $args{foo}; # 1
}


%ENV wird hierbei nicht verändert.

--Rolf

View full thread Korrekter Code?