1 2 3 4 5 6 7 8 9 10 11 12 13
use strict; use warnings; use Data::Dumper; my $x = foo(); print "$x\n"; # 4711 my @y = foo() or die "Kein Array bekommen!"; print Dumper @y; # $VAR1 = undef; sub foo{ return wantarray ? undef : 4711; }
1
2
3
$ perl -wle 'my @foo = (undef) or die "is nicht"'
$ perl -wle 'my @foo = () or die "is nicht"'
is nicht at -e line 1.
2012-02-10T12:42:59 LinuxerDas Zuweisen einer Liste mit einem Element "undef" ist nicht identisch mit dem Zuweisen einer leeren Liste.
perl -MData::Dumper -wle'sub foo{undef};@a = foo() or die "leer";print Dumper \@a'
2012-02-10T13:17:43 Relais@a = function()
...füllt Deinen Array @a mit einer Liste. Das erste Listenelemet ist vorhanden, existent,definiertund es ist noch dazu undef.
Teste:
Code: (dl )perl -MData::Dumper -wle'sub foo{undef};@a = foo() or die "leer";print Dumper \@a'
QuoteIch spinne das mal weiter. Solange Du vor die Ausgabe Deiner Subroutine einen Array schreibst, dem Du das ganze zuweist, dann hilft Dir auch wantarray nichts mehr. Denn Dein Array ist ein Array, und der Skalar den Du mit wantarray erzwingst, der landet in einem Element Deines Arrays. Das verhält sich dann genau wie oben schon ... aber aus dem Grund, dass Du ein Array erwartest.
2012-02-10T13:52:11 rostiErgo: Ich lasse mir das Anderes einfallen, wantarray ist an der Stelle, wo ich das gerne hätte, nicht wirklich brauchbar ;)
2012-02-10T17:11:09 rostiJa. Dann habe ich kein Array,
2012-02-10T17:11:09 rostidafür eine Exception mit 'nichts drin' in $@ ;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
my @y = foo( foo => 1, bar => 2, baz => 3) or die $@; print "Hallo, ich lebe noch!\n"; sub foo{ my %in = @_; # erstelle eine hashref UND eine liste my $ref = {}; my @li = (); eval{ # zum Testen eine exception die "Something is wrong!\n"; $ref = \%in; @li = values %in; }; return undef if $@; return wantarray ? @li : $ref; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
my @y = foo( foo => 1, bar => 2, baz => 3) or die $@; print "Hallo, ich lebe noch!\n"; sub foo{ my %in = @_; # erstelle eine hashref UND eine liste my $ref = {}; my @li = (); eval{ # zum Testen eine exception die "Something is wrong!\n"; $ref = \%in; @li = values %in; }; return if $@; return wantarray ? @li : $ref; }
2012-02-10T12:15:47 rostihi;
i.f. Code greift das die "Kein Array bekommen!" nicht, obwohl der Return-Value undef ist:
Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13use strict; use warnings; use Data::Dumper; my $x = foo(); print "$x\n"; # 4711 my @y = foo() or die "Kein Array bekommen!"; print Dumper @y; # $VAR1 = undef; sub foo{ return wantarray ? undef : 4711; }
Ist das ein Bug?
Wenn ich jedoch notiere: return wantarray ? () : 4711; stirbt das Script. Verstehe ich nicht: Eine leere Liste ist doch was Definiertes oder?
QuoteWeil Wahrheit immer im skalaren Kontext evaluiert wird....
2012-02-10T19:41:38 murphyreturn; ist äquivalent zu return wantarray ? () : undef;
perldoc -f return... If no EXPR is given, returns an empty list in list context, the undefined value in scalar context, and (of course) nothing at all in void context.
2012-02-10T19:08:47 GUIfreundUnd eine Liste ergibt im skalaren Kontext die Anzahl der Elemente.
1
2
3
4
5
6
7
$ perl -wE'
sub foo { return 6,7,8 }
say scalar foo()'
8
$ perl -wE'sub foo { my @a = (6,7,8); return @a[1,2] }
say scalar foo()'
8
2012-02-10T19:48:11 pq2012-02-10T19:08:47 GUIfreundUnd eine Liste ergibt im skalaren Kontext die Anzahl der Elemente.
das stimmt nicht.
eine liste im skalaren kontext gibt es im prinzip gar nicht.
es gibt arrays im skalaren kontext. dieses liefert dann die anzahl der elemente.
der komma-operator, aber auch listslices, liefern im skalaren kontext das letzte element.
1
2
3
4
('a', 'b', 'c') ist kein Array, sondern eine Liste
@r = ('a', 'b', 'c'); # liefert ein Array der Länge 3
$r = ('a', 'b', 'c'); # liefert c
$r = @r; # liefert 3
QuoteListenwerte besitzen keinen Booleschen Wert, weil Listenwerte nie in einem skalaren Kontext erzeugt werden.
Quoteeine liste im skalaren kontext gibt es im prinzip gar nicht.
return $@ ? () : ($x, $y);
2012-02-11T17:08:11 GUIfreundIch komme nicht dahinter, was da gemeint ist. Vermutlich hängt das mit deinem SatzQuoteeine liste im skalaren kontext gibt es im prinzip gar nicht.
zusammen, den ich ebenfalls nicht verstehe.