Schrift
[thread]6009[/thread]

do { $parent--; }while( $parent >= 0 ): geht nicht bei 0



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
pktm
 2004-01-11 20:25
#79061 #79061
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Bei mir soll eine Schleife ausgeführt werden.
Und zwar die hier:
Code: (dl )
do { $parent--; }while( $parent >= 0 ) # do

Nur wenn der Wert $parent 0 ist wird die Schleife nicht mehr ausgeführt, wieso?
Ist mein Operator falsch?
Da steht doch mache{ den_wert_parent_eins_kleiner }solange( der_wert_parent größer oder gleich 0 ist );
Oder?
Wer kann helfen?
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2004-01-11 20:30
#79062 #79062
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich weiss nicht, ob ich dich gerade richtig verstehe. der block soll solange ausgefuehrt werden, solange $parent >= 0 ist, und bei jedem durchlauf $parent um 1 vermindert werden?
Code (perl): (dl )
1
2
3
while (--$parent >= 0) {
  # mach was
} # while
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kabel
 2004-01-11 22:01
#79063 #79063
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
kabel@kabel:~$ perl
$parent = 0;
do { $parent--; print "dec\n"; } while( $parent >= 0 ) # do

dec
kabel@kabel:~$
-- stefan
[E|B]
 2004-01-11 22:03
#79064 #79064
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@pktm

Welchen Startwert hat denn $parent?
Denk dran, dass "do" zuerst ausgeführt wird und erst dann die "while"-Schleife ausgewertet wird.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
betterworld
 2004-01-12 00:16
#79065 #79065
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Lesbarer und unmissverstaendlicher wuerde die Sache werden, wenn man es so schreibt:
Code (perl): (dl )
1
2
3
for my $parent (reverse 0..4){
  print "$parent\n";
}
pktm
 2004-01-12 01:09
#79066 #79066
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=kabel,11.01.2004, 21:01]kabel@kabel:~$ perl
$parent = 0;
do { $parent--; print "dec\n"; } while( $parent >= 0 ) # do

dec
kabel@kabel:~$
[/quote]
Hm, einegtlich wollte ich mir den Post sparen weil es so unsinnig umfangreich ist aber - der Fehler muss dann wohl irgendwo IN der Schleife liegen.
Und los:
Also ich habe da ein CMS-Administrationsscript wo man bis jetzt neue Seiten in ein CMS einfügen kann.
Da ich die Navigation des CMS mehrstufig machen wollte, also so, dass sich die Navigation bei einer angeklickten
Seite aufklappt und die dem Menupunkt zugeordneten Seiten anzeigt werden wird die Sache etwas komplizierter.
Die Sache ist so vorzustellen:
Man hat 3 Menupunkte, A B & C.
Unter B sollen jetzt aber auch noch die Seiten 1. 2. & 3. untergeordnet werden.
Wenn dann B angeklickt wird sollen 1. 2. und 3. angezeigt werden.
Man kann auch einstellen, ob eine Seite angezeigt wird.
Die Navigationen die bei jeder Seite angezeigt werden sollen werden in der DB hinterlegt (komplett, ich weis, ist
unschön, jedoch dauert das Erstellen der Navs sonst zu lange).
Die nachfolgende Sub aktualisiert nun alle Navs vom untersten Menupunkt aufsteigend duch alle Ebenen, wenn eine neue Seite
angelegt wird.
Also wenn man jetz folgende Struktur hat...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
A
->A.1
->A.2
->A.3 (nicht angezeigt)
->->A.3.I
->->A.3.II
B
->B.1
->B.2
C


...dann fängt die Sub bei A.3.II an und arbeitet sich durch die ganze DB.
Das hat damit etwas zu tun, dass später Seiten unter mehrere Menupunkte eingetragen werden können sollen (richtig?)
und so alle betroffenen Navs geändert werden müssen.
Das durcharbeiten funktioniert so:
Man fängt bei der untersten Ebene der Seiten an und guckt, welche Seiten noch unter den Punkt untergeordnet werden
sollen, dem die aktuelle Seite untergeordnet wird.
Also beim Beispiel, wenn der Punkt A.3.II angelegt würde  würde die Sub im ersten Durchlauf (ich weis, es ist die Schleife...) die Navs für A.3.II & A.3.I
erstellen / aktualisieren.
Dann ginge es weiter zu A.3 wo dann die Navs von A.3, A.2 & A.1 geändert würden.
Jetzt mein Problem:
Kommt man in der obertsen Ebene an soll die Navigation für diese natürlich auch geändert werden (könnte ja sein,
dass man z.B. Seite D hinzugefügt hat).
Nur werden für die oberste Ebene die Navigationen nicht erstellt.
Das muss irgendwie and er Logik in der Schleife do { $parent--; }while( $parent >= 0 ) # do liegen.
Ich habe aber noch nicht raus wieso.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
sub erstelle_navs {
   my $insert_id = shift;
   my $parent = shift;
   my $vnav = get_template_bn('vnav');
   my $vnav_sub = get_template_bn('vnav_sub');
   do {
       # -- ist die aktuelle Nummer überhaupt irgendwo als parent angegeben?
       my $cmd0 = "SELECT parent FROM seiten";
       my $sth0 = $dbh->prepare($cmd0) || die $dbh->errstr;
       my $rv0 = $sth->execute || die $dbh->errstr;
       if( $rv0 eq "0E0" ){
           last;
       }else{
           my $found = 0;
           while( my ($proveParent) = $sth0->fetchrow_array() ){
               if( $proveParent == $parent ){
                   $found = 1;
               }
           }
           unless( $found ){
               $parent--;
               next;
           }
       }
       # gibt an, dass was gemacht wurde
       $template->param( "error" => "seite erstellt ($parent)" );
       my $cmd = undef;
       if( $parent == 0 ){
           # oberste Ebene: visible egal, da visible nur für subnavs!
           $cmd = "SELECT keyword, titel FROM seiten WHERE parent='$parent'";
       }else{
           $cmd = "SELECT keyword, titel FROM seiten WHERE parent='$parent' and visible=1";
       }
       my $sth = $dbh->prepare($cmd) || die $dbh->errstr;
       my $rv = $sth->execute || die $dbh->errstr;
       my $vnav_template = undef;
       if ( $parent == 0 ){
           $vnav_template = $vnav;
       }else{
           $vnav_template = $vnav_sub;
       }
       my @rec_sites = (); # merken, für welche Seiten die Nav erstellt wird
       my $seiten = []; #array für LOOP-values
       while( my ($keyword, $titel) = $sth->fetchrow_array() ) {
           push @{ $seiten }, { "link" => $cgi->a( {href => $template->{relative_url} . "?action=$keyword" }, "$titel") };
           push @rec_sites, $titel;
       } # while( my ($keyword, $titel) = $sth->fetchrow_array() ) {
       $sth->finish();
       # dieselbe Nav für alle mit gleichem parent!
       my $vnav_zw_t = HTML::Template->new(arrayref => [$vnav_template], die_on_bad_params => 0, associate => [$template, $cgi] );
       $vnav_zw_t->param( "vnav" => $seiten );
       # insert
       foreach my $elem ( @rec_sites ) {
           my $cmd1 = "UPDATE seiten SET vnav=" . $dbh->quote( $vnav_zw_t->output() ) . " WHERE titel=" . $dbh->quote($elem);
           unless ($dbh->do($cmd1)) {
               die($dbh->errstr, "Error in executing Sql-Statement:\n\t$cmd1");
           }
       }
       $parent--;

   }while( $parent >= 0 ) # do
} #erstelle_navs
http://www.intergastro-service.de (mein erstes CMS :) )
pktm
 2004-01-12 01:10
#79067 #79067
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[E|B
,11.01.2004, 21:03]@pktm

Welchen Startwert hat denn $parent?
Denk dran, dass "do" zuerst ausgeführt wird und erst dann die "while"-Schleife ausgewertet wird.

$parent kann von 0 bis zu der (auto-increment-) ID - 1 der neu eingefügten Seite variieren.

Edit: s/\s\-/\s\+/;\n\n

<!--EDIT|pktm|1073936554-->
http://www.intergastro-service.de (mein erstes CMS :) )
Crian
 2004-01-12 11:06
#79068 #79068
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich würde aus rein ästhetischen Gründen eine while-Schleife daraus machen, aber das wird Dein Problem wohl nicht lösen. Aber da $parent zu Beginn ja einen Wert (>0) hat oder haben sollte (ggf. Übergabewerte der Funktion auf Existenz (defined) und Sinnhaltigkeit überprüfen, das empfiehlt sich eigentlich für jede Funktion und hilft ungemein dabei, lange Debug-Arien zu vermeiden), kannst Du das ja ohne Bedenken umstellen.\n\n

<!--EDIT|Crian|1073898459-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-01-12 11:18
#79069 #79069
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Probier mal diese Variante (mit Fehlerbehandlung (ggf. anpassen) und einigen anderen optischen Verschönerungen, der Fehler müsst aber noch drin sein :D (aber vielleicht ja auch nicht...)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
sub erstelle_navs {
my $insert_id = shift;
my $parent = shift;

die "Undefinierte Parameter in Funktion erstelle_navs" unless defined $insert_id and defined $parent;
die "Unsinniger Wert für \$parent '$parent'" unless $parent >= 0;
die "Unsinniger Wert für \$insert_id '$insert_id'" unless $insert_id >= 0;

my $vnav = get_template_bn('vnav');
my $vnav_sub = get_template_bn('vnav_sub');

while ($parent >= 0) {
# -- ist die aktuelle Nummer überhaupt irgendwo als parent angegeben?
my $cmd0 = "SELECT parent FROM seiten";
my $sth0 = $dbh->prepare($cmd0) || die $dbh->errstr;
my $rv0 = $sth->execute || die $dbh->errstr;
if ($rv0 eq "0E0") {
last;
}
else {
my $found = 0;
while (my ($proveParent) = $sth0->fetchrow_array()) {
if ($proveParent == $parent) {
$found = 1;
}
}
unless ($found) {
--$parent;
next;
}
}

# gibt an, dass was gemacht wurde
$template->param("error" => "seite erstellt ($parent)");
my $cmd = $parent == 0 ? "SELECT keyword, titel FROM seiten WHERE parent='$parent'"
: "SELECT keyword, titel FROM seiten WHERE parent='$parent' and visible=1";

my $sth = $dbh->prepare($cmd) || die $dbh->errstr;
my $rv = $sth->execute || die $dbh->errstr;
my $vnav_template = $parent == 0 ? $vnav : $vnav_sub;
my @rec_sites = (); # merken, für welche Seiten die Nav erstellt wird
my $seiten = []; #array für LOOP-values

while (my ($keyword, $titel) = $sth->fetchrow_array()) {
push @{ $seiten }, { "link" => $cgi->a({href => $template->{relative_url} . "?action=$keyword" }, "$titel")};
push @rec_sites, $titel;
} # while( my ($keyword, $titel) = $sth->fetchrow_array() ) {
$sth->finish();

# dieselbe Nav für alle mit gleichem parent!
my $vnav_zw_t = HTML::Template->new(arrayref => [$vnav_template], die_on_bad_params => 0, associate => [$template, $cgi]);
$vnav_zw_t->param("vnav" => $seiten);

# insert
foreach my $elem (@rec_sites) {
my $cmd1 = "UPDATE seiten SET vnav=" . $dbh->quote($vnav_zw_t->output()) . " WHERE titel=" . $dbh->quote($elem);
unless ($dbh->do($cmd1)) {
die($dbh->errstr, "Error in executing Sql-Statement:\n\t$cmd1");
}
}
--$parent;

} # while $parent >= 0

} #erstelle_navs
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pktm
 2004-01-12 20:34
#79070 #79070
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Na - wer sieht den Fehler?
Er ist winzig!
Habe ich mich eben geärgert!
Tipp1: Es handelt sich um einen Rechtschreibfehler und er ist ein gutes Beispiel dafür, warum man Variablennamen in perl nicht durchnummerieren sollte...
Hab ich mich geärgert... :angry:
http://www.intergastro-service.de (mein erstes CMS :) )
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-01-11 20:25.