Schrift
[thread]6623[/thread]

Parameteränderung bei Funktion



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Fraser
 2005-01-11 18:41
#50705 #50705
User since
2005-01-10
10 Artikel
BenutzerIn
[default_avatar]
Hi Leute,

ich hab hier eine kleine Funktion, bei der sich die Parameter verändern. (Es ist ne Übungsaufgabe; also brauche ich keine Verbesserungsvorschläge. Ich bin schon über kleine Hinweise dankbar)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$a = 2;
@x = (1..5);
 
@y = scale_ary2($a, @x);
print "\@x = @x \n";
print "\@y = @y \n";
 
sub scale_ary2 {

        $scale = shift;   # 2
                     
       for (@_) {     # @_ = 1 2 3 4 5
       $_ *= $scale;    
     
       }      
       return @_;  # wohin wird das neue @_ hingeliefert?
}
esskar
 2005-01-11 19:26
#50706 #50706
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
und wie ist die frage?

btw. use strict!
Taulmarill
 2005-01-11 19:38
#50707 #50707
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@esskar: die frage steht im code

@Fraser: der inhalt von @_ sollte durch das return da hin zurückgegeben werden, wo die funktion aufgerufen wurde. in diesem fall währe das @y
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
jemand
 2005-01-11 20:45
#50708 #50708
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
hä?
ich dachte in @_ kann man nicht schreiben??
oder irr ich mich da?
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
esskar
 2005-01-11 20:58
#50709 #50709
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du irrst dich
Taulmarill
 2005-01-11 21:30
#50710 #50710
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
die for schleife ändert @_ da $_ geändert wird und diese änderungen von for automatisch in @_ übernommen werden.
siehe perldoc perlsyn ab zeile 279.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
betterworld
 2005-01-11 21:31
#50711 #50711
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Das neue @_ landet nicht nur in @y, sondern auch in @x. Genauer gesagt veraendern sich die Werte in @x, wenn man die in @_ veraendert, weil @_ nur Aliase enthaelt
Fraser
 2005-01-11 23:33
#50712 #50712
User since
2005-01-10
10 Artikel
BenutzerIn
[default_avatar]
[quote=betterworld,11.01.2005, 20:31]Das neue @_ landet nicht nur in @y, sondern auch in @x.  Genauer gesagt veraendern sich die Werte in @x, wenn man die in @_ veraendert, weil @_ nur Aliase enthaelt[/quote]
Genau das ist das Problem. Kannst du mir das mit den Alias genauer erklären??
Dubu
 2005-01-12 14:08
#50713 #50713
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Parameter an Subroutinen in Perl sind immer Call-by-Reference.
Siehe perlsub, Abschnitt BESCHREIBUNG, dritter Absatz:
Quote
Alle übergebenen Argumente befinden sich im Array @_ . Bei zwei Argumenten wären diese also in $_[0] und $_[1] gespeichert. @_ ist ein lokales Array, allerdings sind die Elemente Aliase für die originalen Parameter. D.h., wenn das Element $_[0] verändert wird, wird das entsprechende Original auch verändert (oder wenn es nicht veränderbar ist, tritt ein Fehler auf).

Wenn man das vermeiden moechte, muss man vor dem Bearbeiten oder beim Bearbeiten eine lokale Kopie der Daten anlegen:
Code: (dl )
1
2
3
4
sub foo {
   my @data = @_;    # Kopie anlegen
   # jetzt kann man mit @data arbeiten
}

Natuerlich muss man dabei beruecksichtigen, dass der Platz fuer das Array dann zweimal benoetigt wird.

Aehnlich funktioniert auch die for-Schleife, wie in deinem Beispiel:
Code: (dl )
1
2
3
for (@array) {
   $_ *= $faktor;    # $_ ist ein Alias fuer das Element in @array
}
Hier wird nicht nur die Variable $_ lokal geaendert, sondern gleichzeitig auch das korrespondierende Element in @array.
Taulmarill
 2005-01-12 14:58
#50714 #50714
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
dieses Verhalten von @_ kann man sich z.B. so zu nutze machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;

my $a = 2;
my @x = ( 1 .. 5 );
my @y = @x;

scale_ary2($a, @y);
print "\@x = @x \n";
print "\@y = @y \n";

sub scale_ary2 {
my $scale = shift;
$_ *= $scale for @_;
1;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-01-11 18:41.