Thread [Tipp] Parameter in Prozeduren: sicher auslesen (7 answers)
Opened by GwenDragon at 2006-02-22 15:30

GwenDragon
 2006-02-22 15:30
#63207 #63207
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Einzelne Parameter übernehme ich mit
Code: (dl )
1
2
my $par1 = shift;
my $par2 = shift;
, mehrere kopiere ich mit
Code: (dl )
my ($par1, $par2, @par3 ) = @_;

Jetzt sagt perldoc perlsub zu Parametern bei Prozeduren:
Quote
The array @_ is a local array, but its elements are aliases for the actual scalar parameters. In particular, if an element $_[0] is updated, the corresponding argument is updated (or an error occurs if it is not updatable).
Das bedeutet, dass jede Veränderung eines Elements von @_ auch die Variable ändert, die als Parameter übergeben wurde.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/local/bin/perl

use strict;
use warnings;

sub mysub {
    $_[0] +=100 if $_[0] < 2000;
}

my $test=100;
mysub ( $test );

print $test;
# gibt 200 aus!

Damit werden die Parameter nicht wie bei anderen Sprachen als Kopien von Werte in einem Stack, sondern als Referenzen in einem Stack übergeben!

Eine ziemliche Falle für Anfänger. Und für Umsteiger von anderen Sprachen. Und für Leute, die Code umschreiben müssen. Und für übernächtigte Leute ;)

Tipp 1: Mit dem Kopieren von @_ bzw. shift bin ich auf der sicheren Seite!

Tipp 2: Mal den eigenen Code auf Konstrukte wie @_= oder $_[ ...] = überprüfen!


PS: gehört das vielleicht eher ins Wiki?\n\n

<!--EDIT|GwenDragon|1140615399-->

View full thread [Tipp] Parameter in Prozeduren: sicher auslesen