Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7728[/thread]

[Tipp] Parameter in Prozeduren: sicher auslesen



<< >> 8 Einträge, 1 Seite
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-->
Relais
 2006-02-22 15:40
#63208 #63208
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hmm, spitzfindig gesagt sind's Aliase, keine Referenzen. Das erlaubt sowas wie:
Code: (dl )
1
2
3
4
5
sub y2k {
tr/y/k/ for @_
}

y2k @all_my_code; # kuemmert sich um das Y2K-Problem in meinem Code
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
esskar
 2006-02-22 15:49
#63209 #63209
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
*rofl*
GwenDragon
 2006-02-22 16:13
#63210 #63210
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
[quote=Relais,22.02.2006, 14:40]Hmm, spitzfindig gesagt sind's Aliase, keine Referenzen.[/quote]
Ja, steht ja auch im perldoc.
Strat
 2006-02-23 00:04
#63211 #63211
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich finde diesen weg nicht schlecht, auch wenn er ein wenig komplizierter ist als bei vielen anderen sprachen; so kann man halt entscheiden, ob man call by value oder by reference haben will. Und wenn man noch dazu ein wenig mit wantarray oder CPAN:Contextual::Return rumspielt, kann man schon recht interessante sachen machen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
GwenDragon
 2006-02-23 10:13
#63212 #63212
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Ja, das stimmt. Es bieten sich mehr Möglchkeiten.
Wie ich schon schrieb, es geht mir um das Aufdecken der Stolperstellen für andere.
Oder wer von euch wäre früher als Perl-Beginner nicht mal über sowas gedanklich gestolpert? ;)
renee
 2006-02-23 10:48
#63213 #63213
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=GwenDragon,22.02.2006, 14:30][...]
PS: gehört das vielleicht eher ins Wiki?[/quote]
Das ist auf jeden Fall einen Artikel wert!
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/
Crian
 2006-02-23 11:38
#63214 #63214
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
[quote=GwenDragon,23.02.2006, 09:13]Oder wer von euch wäre früher als Perl-Beginner nicht mal über sowas gedanklich gestolpert? ;)[/quote]
Nö, als Perlanfänger hatte ich mich vorher schon mit der Parameterübergabe in so vielen anderen Sprachen beschäftigt, dass das kein Problem war.

Pascal z.B. hatte auch die Möglichkeit, call by value oder call by reference zu verwenden.

C bietet nur call by value, dafür Pointer, mit denen man das "umgehen" kann.

Fortran hatte reines call by reference iirc.

Auf jeden Fall finde ich das Perlkonzept da ziemlich gelungen. Ich hole mir meistens auch meine Variablen "by value" mit
Code: (dl )
my ($foo, $bar, $baz) = @_;

. Und natürlich finde ich einen Beitrag dazu im Wiki sinnvoll, wem das Konzept der Parameterübergabe nicht schon vertraut ist, wenn er sich in Perl einarbeitet, wird da vermutlich leicht verwirrt.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 8 Einträge, 1 Seite



View all threads created 2006-02-22 15:30.