Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6463[/thread]

Merkwürdiges Erlebnis mit push(): push gegen fetchrow_array()



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2004-08-05 08:38
#85398 #85398
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Also pass auf, ich hab zwei Codes, der obere funktioniert, der untere löst einen Zombie aus !!
Code: (dl )
1
2
3
4
5
6
my @array = ();
my @oldarray = (1,2,3,4);
for (@oldarray) {
push @array, "$_";
}
print @array; # 1234


nun das Mysterium:
Code: (dl )
1
2
3
4
for ($sth_prepare->fetchrow_array()) {
push @array, "$_";
last if $counter == 14;
}

zuerst hab ich gedacht, dass eine Endlosschleife entsteht, wobei ich das auch nicht wirklich hätte nachvollziehen können.

Nach dem Versuch mit einem normalen Array (anstelle von fetchrow_array()) hat's dann geklappt. Es liegt also am push().

Dann hab ich mal den push durch print $_ ausgetauscht um zu sehen was die Datenbankabfrage ausgibt, aber da kam genau dasselbe wie im Array ($oldarray).

was geht hier schief??
Froschpopo
 2004-08-05 08:46
#85399 #85399
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich dreh am Rad,
ich hab jetzt push @array, ["$_"] und hinterher dereferenziere ich dann wieder, aber das ist ja so wie wenn ich ne Pommes ohne Majo hole und danach nochmal loslatsche um welche zu holen..... was für eine unsichtbare Kraft ist hier am wirken? Ich hab nichts getan, ich schwör!! Ich glaub sowas nennt man Telekinese, mein Vormieter ist in der Wohnung hier verstorben, vielleicht ist dem sein Geist noch geblieben und der ist jetzt sauer weil ich seine Autoreifen übernommen hab! :(
renee
 2004-08-05 08:58
#85400 #85400
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
for ($sth_prepare->fetchrow_array()) {
push @array, "$_";
last if $counter == 14;
}

wie sieht der Code davor aus??
lass mal die " weg, also:
Code: (dl )
  push(@array,$_);
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/
Froschpopo
 2004-08-05 09:00
#85401 #85401
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
der Code davor sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $sth_prepare = $dbh1->prepare("select count(*) from userlog where userid = '$userid' limit 0,14");
$sth_prepare->execute() or die $DBI::errstr;
my @array = ();
my $toll;
my $counter = 0;

print "Content-Type: text/html\n\n";
for ($sth_prepare->fetchrow_array()) {
push @array, ["$_"];
last if $counter == 14;
}
print @array;

ohne den " hab ich auch schon probiert, aber danach kann ich das Programm nur noch killen....
Froschpopo
 2004-08-05 09:09
#85402 #85402
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ah jetzt hab ichs, der Zombie wird hier erzeugt:
Code: (dl )
1
2
3
4
my @array = (1,2,4);
while (@array) {
#...
}


Wieso!?????
renee
 2004-08-05 09:13
#85403 #85403
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist ne Endlosschleife, weil im Schleifenkopf überprüft wird, ob @array Elemente hat. Das ist in Deinem Fall immer wahr!
Wenn Du über die Elemente iterieren möchtest, dann musst Du das so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
for(@array){
print $_,"\n";
}

# oder

foreach(@array){
print $_,"\n";
}
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/
renee
 2004-08-05 09:15
#85404 #85404
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
übrigens kannst Du das
Code: (dl )
 last if $counter == 14;

weglassen
1.) hast Du ja in der SQL-Abfrage schon das Limit 0,14 gesetzt
2.) zählst Du $counter nicht hoch, so dass es immer 0 bleibt...
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/
Froschpopo
 2004-08-05 09:23
#85405 #85405
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber warum funktioniert dann das hier:
Code: (dl )
1
2
3
while ($sth->fetchrow_array()) {
#...
}

das müsste doch auch Wahr ergeben oder nicht, da ist dasselbe drin wie in dem Array !
renee
 2004-08-05 09:33
#85406 #85406
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, weil hier nach jedem Schleifenduchlauf mit fetchrow_array() das nächste Ergebnis-Array geholt wird. Und wenn alle Ergebnisse der Abfrage vorher schon geholt wurden, dann gibt fetchrow_array() undef zurück und somit wird die Bedingung im Schleifenkopf false...

edit: Bei Dir steht immer das selbe Array drin - das hat auch immer Elemente. Durch die Funktion fetchrow_array() wird dort immer ein anderes Array überprüft!\n\n

<!--EDIT|renee|1091684124-->
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/
pq
 2004-08-05 11:14
#85407 #85407
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,05.08.2004, 06:38]
Code: (dl )
   push @array, "$_";

[/quote]
perldoc -q "What's wrong with always quoting "$vars"?"
hat das einen bestimmten grund, dass du hier anführungszeichen benutzt?
dieser fehler wird so häufig gemacht, dass ich echt langsam mal wissen würde,
woher das kommt. steht das in irgendeinem buch?
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
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-08-05 08:38.