User since
2006-06-21
1
Artikel
BenutzerIn
ich wollte mal fragen, ob mir jemand sagen kann, was der unterschied zwischen methoden mit und ohne & ist?
User since
2004-02-19
1750
Artikel
BenutzerIn
eine subroutine kann mit oder ohne '&' aufgerufen werden, dies macht vom aufruf her keinen unterschied. in seltenen fällen kann es aber vorkommen, dass perl nicht erkennt, dass es sich bei einem subroutinenaufruf um einen solchen handelt, in diesen fällen kann mit einem vorgestellten '&' der aufruf eindeutig als solcher gekennzeichnet werden. siehe auch
perlsub
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
User since
2005-09-08
300
Artikel
BenutzerIn
Hab' mal ein Beispiel generiert, um das mit dem "Deutlichmachen" ein bisschen zu veranschaulichen:
sub getFunc {
return("func" . "Name");
}
sub funcName {
printf("EXECUTING FUNCTION !\n");
}
&{getFunc()}();
Gruß, Doc
User since
2003-08-04
14371
Artikel
ModeratorIn
Am größten ist der Unterschied bei:
#!/usr/bin/perl
use strict;
use warnings;
my $counter = 1;
sub test{
print "Lauf: $counter @_\n";
}
@_ = qw~1 2 3~;
&test;
++$counter;
test;
Ausgabe:
Wenn man die Klammern weglässt und mit
& aufruft, dann wird
@_ als Parameterliste übergeben...
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
* Wie renee schon sagte: Mit &, ohne Klammern, wird automatisch das aktuelle gültige Parameterarray @_ wieder als Parameter übergeben. Selten, dass man das absichtlich macht.
* docsnyders Beispiel ist evil, weil es symbolische Referenzen benutzt und unter "use strict" kracht.
Aber in einem stimmt's: Wenn Name oder Referenz einer Subroutine gebraucht wird, muss das "&" davor stehen.
(Bsp.: $mysubref = \&mysub;).
* Mit "&" werden Prototypen ignoriert. Wenn man Prototypen nutzt, darf man also kein "&" vor den Aufruf setzen.
* Mit "funktionsname()" ist man immer auf der sicheren Seite, ob mit oder ohne Prototypen.
* Historisch gab es zuerst nur die Form mit "&". Weil es so gut zu den anderen Sigils passt ("$" für Skalare, "@" für Arrays etc.) und selbstdefinierte Funktionen von den eingebauten Perl-Funktionen unterscheidet, benutzen viele immer noch die Form mit dem "&" davor. (Gell, strat? ;))
User since
2003-08-04
5246
Artikel
ModeratorIn
@dubu: genau; wobei ich seit ein paar Jahren die &-Form nur noch fuer Subroutinen verwende, die ich selbst gecoded habe, nicht mehr fuer fremde. Das hat den optischen Vorteil, dass ich auf den ersten Blick zwischen fremden Subs, die ich importiert habe, und eigenen unterscheiden kann.
&Sub ohne () verwende ich gar nicht; wenn ich das haben will, schreibe ich da explizit &Sub(@_) oder so aehnlich... (siehe auch meine "Einfuehrung in Perl")
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
wird eh auhc abgeschafft in perl6 liefert & referenz auf eine sub und unterbindet ausführung
User since
2003-08-04
5246
Artikel
ModeratorIn
@lichtkind: darueber mache ich mir dann gedanken, wenn perl6 kommt.