Schrift
[thread]11086[/thread]

scalar comma operator



<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
KurtZ
 2008-12-31 02:05
#104299 #104299
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hallo

weiß jmd wann man den "scalar comma operator" sinnvoll braucht?

perldoc FAQ Unterschiede zw. Listen und Arrays

erscheint mir ziemlich überflüssig...


Crossposting Selfhtml
TMTOWTDYOG (there's more than one way to dig your own grave)
lichtkind
 2008-12-31 02:30
#104300 #104300
User since
2004-03-22
5679 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
naja es geht doch darum ergebnisse aneinanderzufügen und den letzten nur zu verwerten. wenn du nicht weisst ob da noch was nachkommt aber definitv nur den letzten brauchst kann das schon praktisch sein.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
KurtZ
 2008-12-31 02:38
#104301 #104301
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
sorry, verstehe ich nicht, hier gehts doch um literal angegebene Listen und nicht um Arrays...d.h. zur compilezeit weiß ich doch was das letzte Element ist.

Intuitiv würde ich annehmen, das Listen sollten sich wie arrays verhalten, d.h.
$tmp=("a","b","c") sollte die Länge 3 zuweisen und nicht das letzte element "c".
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-12-31 02:47
#104302 #104302
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das beispiel ist ungünstig.
Code: (dl )
1
2
3
4
5
6
my $foo = (tuwas(), tu_nochwas(), 23); # $foo = 23
sub boo {
return 2,3,4;
}
my $far = boo(); # 4
my @bar = boo(); # 2,3,4
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
ptk
 2008-12-31 03:50
#104304 #104304
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Den comma-Operator kennt man aus C. Dort wird er häufig verwendet, um for-Schleifen zu erstellen, die mehrere Laufvariablen initialisieren oder inkrementieren:
Code: (dl )
for(i=0,j=1; i<10; i++,j+=2) { ... }


Bei Perl kann man es verwenden, wenn man bei nachgestellten if/unless/for ... mehr als eine Anweisung haben möchte. Also beispielsweise:
Code: (dl )
1
2
3
4
$x=$_*2,print("$x\n") for 1..10;

$y=3,$z=4 if !defined $foo;
print "\$y=$y, \$z=$z\n";

Man könnte hier natürlich auch do { ... } schreiben und ganz normal mit Semikolon abtrennen.
KurtZ
 2008-12-31 04:04
#104305 #104305
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
naja schon ne komische sache ...

my $far = boo(); # 4
my @bar = boo(); # 2,3,4

hast du schon mal den Fall gehabt dass du aus einem sub im scalaren context genau das letzte element des listen context zurückgeben wolltest?

Ich meine wie oft hat man eine Datenstruktur der Form (schüler1,schüler2,...,klassenlehrer)?

Das tritt doch IMHO eher selten auf, und man kann doch aus einer subroutine explizit contextabhängige Rückgaben machen wenn dieser Fall gewünscht ist.


my $foo = (tuwas(), tu_nochwas(), 23); # $foo = 23

sollte doch äquivalent sein zu

my $foo = eval { tuwas(); tu_nochwas(); 23 };

naja, wie auch immer , danke!
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-12-31 12:31
#104308 #104308
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
ptk+2007-12-31 02:50:57--
Den comma-Operator kennt man aus C. Dort wird er häufig verwendet, um for-Schleifen zu erstellen, die mehrere Laufvariablen initialisieren oder inkrementieren:
Code: (dl )
for(i=0,j=1; i<10; i++,j+=2) { ... }


ok jetzt wirds mir klarer... kennt C auch die Rückgabe des letzten Wertes?

ptk+2007-12-31 02:50:57--
Bei Perl kann man es verwenden, wenn man bei nachgestellten if/unless/for ... mehr als eine Anweisung haben möchte. Also beispielsweise:
Code: (dl )
$x=$_*2,print("$x\n") for 1..10;

Man könnte hier natürlich auch do { ... } schreiben und ganz normal mit Semikolon abtrennen.


wohl mit dem unterschied das do { ... } ein echter Block ist.

ciao
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-12-31 13:26
#104310 #104310
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
KurtZ+2007-12-31 03:04:56--
my $foo = (tuwas(), tu_nochwas(), 23); # $foo = 23

sollte doch äquivalent sein zu

my $foo = eval { tuwas(); tu_nochwas(); 23 };

nein. das zweite beispiel hat ein block-eval, das ist überhaupt
nicht aequivalent. wenn dann eher do {}; aber ein do drumherum
ist eine extra operation und mehr zu schreiben.
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
ptk
 2008-12-31 13:32
#104312 #104312
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Sieht so aus:
Code: (dl )
1
2
3
4
5
main() {
int j;
j = (1, 314, 4711);
printf("j=%d\n", j);
}

Ergibt j=4711.
KurtZ
 2008-01-08 17:26
#104489 #104489
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Schönes Neues,

pq+2007-12-31 12:26:33--
nein. das zweite beispiel hat ein block-eval, das ist überhaupt
nicht aequivalent. wenn dann eher do {}; aber ein do drumherum
ist eine extra operation und mehr zu schreiben.


du hast natürlich recht, do war mir entfallen.

Allerdings finde ich das der "comma operator" syntaktisch zu oft greift.

Insbesondere Codepattern die die Rückgabe des letzten Wertes brauchen???
Die kommen viel zu selten vor, als das gerechtfertigt wäre dafür die Orthogonalität zur Arraynutzung zu brechen.

Ich habe versucht schlau zu werden ob das in perl6 anders wird, bin aber nicht weiter gekommen. Blickt von euch jemand durch?

Gruß
Kurt
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2008-12-31 02:05.