Schrift
[thread]9229[/thread]

Seltsame "autovivication" mit "and"?



<< >> 5 Einträge, 1 Seite
toby
 2007-07-26 00:28
#78911 #78911
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Community! :)

beim programmieren bin ich auf ein seltsames Verhalten beim 'and' nach einer autovivication gestossen. Hab daraufhin folgendes Code vorbereitet, der dieses Verhalten illustrieren soll. Wer kann mir also folgendes (für mich sehr, sehr seltsames) Verhalten erklären.

Der Code:
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
#!/usr/bin/perl

use strict;
use warnings;

my $arg = shift;
my %blah;

for my $lauf (1..3){

#a)
if ( $arg eq 'a' ) {
printf "$lauf. vor ++\n";
$blah{$lauf}++;
printf "$lauf. nach ++\n";
next;
}
#b)
if ( $arg eq 'b' ) {
printf "$lauf. vor ++\n" and
$blah{$lauf}++ and
printf "$lauf. nach ++\n" and
next;
}

#c)
printf "$lauf. vor ++\n" and $blah{$lauf}++ and printf "$lauf. nach ++\n" and next if ( $arg eq 'c');
}

foreach(keys %blah){
print "hier spricht die autovivication vom lauf $_ fuer $arg\n";
}

print "END\n";


Das Verhalten:

Quote
$ perl autovivication_with_and.pl a
1. vor ++
1. nach ++
2. vor ++
2. nach ++
3. vor ++
3. nach ++
hier spricht die autovivication vom lauf 1 fuer a
hier spricht die autovivication vom lauf 3 fuer a
hier spricht die autovivication vom lauf 2 fuer a
END
$ perl autovivication_with_and.pl b
1. vor ++
2. vor ++
3. vor ++
hier spricht die autovivication vom lauf 1 fuer b
hier spricht die autovivication vom lauf 3 fuer b
hier spricht die autovivication vom lauf 2 fuer b
END
$ perl autovivication_with_and.pl c
1. vor ++
2. vor ++
3. vor ++
hier spricht die autovivication vom lauf 1 fuer c
hier spricht die autovivication vom lauf 3 fuer c
hier spricht die autovivication vom lauf 2 fuer c
END


Warum fehlen bei 'b' und 'c' die durch 'and' in der Rheie geschalteten Ausgaben, wie es der Fall bei 'a' ist? Die incrementierung ist aber auf jeden Fall erfolgt... *confused*

Wer kann das erklären?
TIA
Toby\n\n

<!--EDIT|toby|1185395813-->
PerlProfi
 2007-07-26 02:14
#78912 #78912
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Da der Operator ++ nach der Variablen steht, wird ihr alter Wert und nicht der inkrementierte zurückgeliefert, dieser ist false, deshalb wird die 'nach ++' Ausgabe bei b) und c) ausgelassen.

Aber wo genau gibt es denn hier autovivication ?
edit: Und heißt das nicht sowieso autovivification, oder gibt es da einen Unterschied ?

MfG\n\n

<!--EDIT|PerlProfi|1185401780-->
jubei
 2007-07-26 02:27
#78913 #78913
User since
2007-07-19
22 Artikel
BenutzerIn
[default_avatar]
autovivification ist richtig xD

da die hash werte $blah{$lauf} nur implizit ueber die inkrementationen erzeugt werden, denk ich schon, dass man hier von autovivification sprechen kann. hab jetzt aber wiederum auch nicht die _exakte_ definition von auto-dings-bums im kopp...
toby
 2007-07-26 03:07
#78914 #78914
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hi :)

> Da der Operator ++ nach der Variablen steht, wird ihr alter Wert und nicht der inkrementierte zurückgeliefert

argh.. *mit_der_hand_vor_den_kopf_haun* ;)

> Aber wo genau gibt es denn hier autovivication ?
@jubel hat schon erklärt

> edit: Und heißt das nicht sowieso autovivification
ja, klar, war typo. sorry


Ich denke, ich soll schon mal ab und zu eine Pause einlegen, sonst sieht man den Wald vor lauter Bäumen nicht und man produziert zusätzlich typos ;)

Danke!
T.
pq
 2007-07-26 11:39
#78915 #78915
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=jubei,26.07.2007, 00:27]autovivification ist richtig xD

da die hash werte $blah{$lauf} nur implizit ueber die inkrementationen erzeugt werden, denk ich schon, dass man hier von autovivification sprechen kann. hab jetzt aber wiederum auch nicht die _exakte_ definition von auto-dings-bums im kopp...[/quote]
nein, du greifst direkt auf $bla{$lauf} zu.
autovivification ist
$array[$x]->{"foo"}->[0] = "January";
wenn $array[$x]->{"foo"} vorher nicht definiert war.
perlref
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
<< >> 5 Einträge, 1 Seite



View all threads created 2007-07-26 00:28.