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

Grundsatzfrage zum Aufruf einer Sub



<< >> 9 Einträge, 1 Seite
RPerl
 2007-03-24 11:31
#75320 #75320
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo :)

ich hab mal eine Frage und zwar wann benutz ich sowas hier:
Code (perl): (dl )
&grab(\@domains);


und wann sowas hier

Code (perl): (dl )
&grab(@domains);


Oder benutz ich zweiteres garnicht?

Danke und gruß!

Rperl\n\n

<!--EDIT|RPerl|1174728739-->
kristian
 2007-03-24 11:39
#75321 #75321
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Die erste Version \@domains gibt eine Referenz des Datensatzes an die sub. In der sub bearbeitest du den "Orginaldatensatz".

Mit der zweiten Version kopierst du die Daten zur sub. Du bearbeitest in der sub eine Kopie.

Die zweite Version macht nur Sinn wenn du wirklich eine Kopie brauchst, da solche Geschichten:
@domains = &control(@domains);
nur unsinnig Speicher verbrauchen und wohl ein Relikt aus Perl4-Zeiten sind.

Gruss
Kristian
Ronnie
 2007-03-24 11:40
#75322 #75322
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Quote
ich hab mal eine Frage und zwar wann benutz ich sowas hier:
Code (perl): (dl )
&grab(\@domains);

Hier übergibst du eine Referenz auf ein Array. In der Funktion kann dann mit dem ursprünglichen Array gearbeitet werden. Eine Referenz ist sowas wie ein Etikett, was man anstatt des Arrays übergibt. In der Funktion wird dann auf das Etikett geschaut (dereferenziert) und dann mit dem Array gearbeitet, das durch das Etikett identifiziert wird.
siehe: perlref
Quote
und wann sowas hier
Code (perl): (dl )
&grab(@domains);

Hier übergibst du den Inhalt, also die Werte des Arrays. Es wird also eine vollständige Kopie erzeugt, mit der gearbeitet wird.\n\n

<!--EDIT|Ronnie|1174729247-->
kristian
 2007-03-24 12:39
#75323 #75323
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
ROFL
Ev. sollten wir uns absprechen, damit nicht immer zeitgleich das Selbe geantwortet wird :D
RPerl
 2007-03-24 16:00
#75324 #75324
User since
2006-11-26
384 Artikel
BenutzerIn

user image
herzlichen dank euch beiden!
Hab alles verstanden! :)

Schoenes Wochende wuensch ich noch
betterworld
 2007-03-24 17:45
#75325 #75325
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Das stimmt imho nicht ganz, was Ronnie und kristian geschrieben haben.

Bei grab(@domains) werden nicht die Werte des Arrays kopiert.  Es wird fuer jedes Element des Arrays ein Alias uebergeben.  Ausprobieren kann man das so:
Code: (dl )
1
2
3
4
5
6
sub grab {
  $_[0] = "zwei";
}
my @array = ("eins");
grab (@array);
print "@array\n"; # Ausgabe ist zwei

Oft faengt man jedoch eine Subroutine so an:
Code: (dl )
1
2
sub grab {
  my ($stuff, $blah) = @_;

Hier werden tatsaechlich alle Werte kopiert, aber das kommt nicht von der Aufrufart.  Da diese Art, eine Subroutine zu schreiben, aber meist komfortabler ist als staendig $_[0] etc. zu verwenden, kann man den Aufruf ueber grab(\@array) vorziehen.  Was auch nur mit einer Array-Referenz geht, ist, dass man die Laenge des Arrays veraendert.
pq
 2007-03-25 03:00
#75326 #75326
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
oder so:
Code: (dl )
1
2
3
4
5
6
7
perl -wle'
@a = qw(a b c);
print \$a[0];
sub test { print \$_[0]; }
test(@a)'
SCALAR(0x8151c20)
SCALAR(0x8151c20)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2007-03-25 03:17
#75327 #75327
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=pq,25.03.2007, 01:00]oder so:[/quote]
Dies bezieht sich auf das "Ausprobieren kann man das so:", was ich vorhin geschrieben habe.
Strat
 2007-03-25 15:40
#75328 #75328
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei XYZ( @array ) wird zunaechst mal an das @_ der subroutine mit einem Alias (=Call by reference) uebergeben; wenn man Elemente von @_ direkt aendert, aendert man auch die aufrufenden werte.
Erst wenn man was aus @_ herauskopiert, wird es call by value (d.h. wenn da keine Referenzen drinstehen).

Nett ist auch folgender Fehler:
Code: (dl )
1
2
3
4
5
6
7
8
E:\work\projects>perl
use warnings; use strict;
&TestError( 1 );
sub TestError {
$_[0] = 2;
}
^D
Modification of a read-only value attempted at - line 4.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2007-03-24 11:31.