Schrift
[thread]8345[/thread]

Erklärung zu wantarray

Leser: 1


<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten
renee
 2006-09-19 17:04
#70032 #70032
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit wantarray kann man herrausfinden, ob als Rückgabewert einer Subroutine/Methode eine List, ein Skalar angefordert wird, oder ob die Subroutine/Methode im void-Kontext ausgeführt wird.

Beispiel:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/perl

use strict;
use warnings;

# im list-Kontext
my @array = test();
print "@array\n";

# im skalaren kontext
my $test = test();
print $test,"\n";

# im void-Kontext
test();


##
# die sub
##
sub test{
if(wantarray){
print "im list-Kontext\n";
return qw(1 2 3 4);
}
elsif(defined wantarray){
print "im Skalar-Kontext\n";
return "Hallo Welt";
}
elsif(! defined wantarray){
print "im void-Kontext\n";
}
else{
print "dieser Fall sollte eigentlich nie eintreten\n";
}
}


Ausgabe:
Code: (dl )
1
2
3
4
5
6
~/entwicklung 264> perl wantarr.pl 
im list-Kontext
1 2 3 4
im Skalar-Kontext
Hallo Welt
im void-Kontext
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/
vayu
 2006-09-19 17:19
#70033 #70033
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ok ... verstanden, so fast zumindest :)

so kann man quasi methoden "überladen" je nachdem was der aufrufende zurückhaben möchte.

zB Infos aus ner konfig oder sowas.

allerdings verwirrt mich die sache

if(wantarray) => der aufrufer möchte n array/liste zurück bekommen, klar

if(defined wantarray) => wieso sollte es definiert sein, wenn ich doch aber nur n skalar haben möchte, wäre da nicht ein wantscalar besser?
renee
 2006-09-19 17:36
#70034 #70034
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum 2 Funktionen, wenn ich es mit einer erledigen kann?

Man macht möglichst wenig Funktionen, sonst endet man ja wie in PHP , wo es hunderte von Built-In-Funktionen gibt. Das Verhalten von wantarray ist dokumentiert (perldoc -f wantarray) und ist somit ok.
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/
vayu
 2006-09-19 17:42
#70035 #70035
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
naja stimmt schon ...

man muss dann allerdings auf die Reihenfolge achten.

das defined wantarray muss immer nach dem wantarray abgefragt werden. weil definiert ist es wohl auch wenn wantarray im listenkontext ausgewertet wird, richtig?
Taulmarill
 2006-09-19 17:51
#70036 #70036
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
um es mal imho simpler auszudrücken. wantarray gibt true zurück, wenn der sub-aufruf in listenkontext steht, false, wenn er in scalarem kontext steht und undef bei void kontext.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
GwenDragon
 2006-09-19 17:55
#70037 #70037
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Manche können's besser erklären.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

vayu
 2006-09-19 17:57
#70038 #70038
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
ok :P

also würde ein

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
if(wantarray){
print "im list-Kontext\n";
return qw(1 2 3 4);
}
elsif(!wantarray){
print "im Skalar-Kontext\n";
return "Hallo Welt";
}
elsif(! defined wantarray){
print "im void-Kontext\n";
}


reichen, also skalarer kontext gleich !wantarray
Taulmarill
 2006-09-19 18:10
#70039 #70039
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn auf true und false geprüft wird, gilt undef als false, daher würde dein code nicht funktionieren (hättest du auch gerade testen können). also würde der test auf scalar etwa ( defined wantarray and ! wantarray ) lauten. oder man packt das hinter das elsif für den void-kontext.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
vayu
 2006-09-19 18:15
#70040 #70040
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
achsooooo ... wieder was gelernt ... dank euch :)
Relais
 2006-09-19 18:46
#70041 #70041
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=renee,19.09.2006, 15:36]Das Verhalten von wantarray ist dokumentiert (perldoc -f wantarray) und ist somit ok.[/quote]
also, ich finde, das sind mutige Worte. Wantarray ist broken by deisgn, bzw. durfte dann auch als ein Beispiel für schlechtes API-Design in Damians Vortrag auf der EuroOSCON 2006 in Brüssel herhalten.

Siehe dazu auch folgende Verbesserungsversuche:
CPAN:Contextual::Return von Damian und weiter noch
CPAN:Sub::Context
CPAN:Perl6::Contexts

Edit: Jetzt habe ich auch gesehen, wo dieser Thread her kommt :-)\n\n

<!--EDIT|Relais|1158677653-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
<< |< 1 2 3 >| >> 29 Einträge, 3 Seiten



View all threads created 2006-09-19 17:04.