Schrift
[thread]7149[/thread]

Array aus Arrays

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
subsys
 2005-07-21 12:06
#56588 #56588
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich bin gerade am verzweifeln:

Aus folgender sub hole ich mir Daten aus einer Oracle Datenbank. Die Daten werden ins Array gespeichert. Das funktioniert soweit:

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
sub get_auftraege_inetbk
{
my @array;
my $i = 0;
my $statement;
my $sth;
my $dbh;

$dbh = DBI->connect(SQLCONNECT,SQLUSER,SQLPASS) or die ("Database connection not made: $DBI::errstr", "ERROR");
$dbh->{RaiseError } = 1;
$dbh->{LongTruncOk} = 1;
$dbh->{LongReadLen} = 500000;

$sth = $dbh->prepare("SELECT A_ID, BETREFF, TO_CHAR(EDATUM, 'DD.MM.YY HH24:MI'), EMAILADRESSE [..]") or die ("[..]");
$sth->execute() or die ("[..]");
while(my @tmp = $sth->fetchrow_array)
{
 $array[$i][0] = $tmp[0];
 $array[$i][1] = $tmp[1];
 $array[$i][1] = $tmp[2];
 $array[$i][2] = $tmp[3];
 $i++;
}
$sth->finish();
$dbh->disconnect();
return @array;
}


Im "Hauptcode" soll folgendermassen damit weitergearbeitet werden:

Code: (dl )
1
2
3
4
5
6
@aa_inet_bk = get_auftraege_inetbk();
foreach my $bla (@aa_inet_bk)
{
$mail = $aa_inet_bk[$i][3];
# Weiterverarbeiten des Codes
}


Anscheinend produziert das hier eine Endloschleife, was dazu führt, das das Skript endlos läuft.
Ich finde aber im Moment irgendwie keine andere Möglichkeit mehrdimensionale Arrays zu durchlaufen.
Mit Hashes habe ich es auch schon probiert, worauf das Skript wieder in einer Endlosschleife hing. Bin über jeden Hinweis dankbar, da ich im Moment echt am verzweifeln bin.
Taulmarill
 2005-07-21 12:25
#56589 #56589
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
in deinem script sehe ich keine möglichkeit, wie da eine endlosschleife produziert werden sollte. allerdings würde ich die definierte variable auch nutzen, wenn ich schon foreach benutze:
Code: (dl )
1
2
3
4
5
6
@aa_inet_bk = get_auftraege_inetbk();
foreach my $bla (@aa_inet_bk)
{
$mail = $bla->[3];
# Weiterverarbeiten des Codes
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
subsys
 2005-07-21 12:44
#56590 #56590
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Hi,

die Idee war gut.

Code: (dl )
1
2
3
4
5
6
@aa_inet_bk = get_auftraege_inetbk();
foreach my $bla (@aa_inet_bk)
{
$mail = $bla->[1];
# Weiterverarbeiten des Codes
}


Jetzt gibt er mir aber x mal die gleiche Zeile aus. Also die erste :( . Auch ein $mail = $bla->[$i][1]; funktioniert leider nicht, da er mir dann ein "Can't use string ("23") as an ARRAY ref while "strict refs" in use at modules/showauftraege.pm line 42." bringt.

Nachtrag:
Ich ziehe den Code gerade von einer Gentoo Kiste auf SuSE. Dort funktioniert der Code mit @$bla[1] ohne Probleme. Ich versteh die Welt im Moment nicht mehr. Nur das die Daten statt aus einer Oracle DB aus einer MySQL DB kommen.\n\n

<!--EDIT|subsys|1121936825-->
Taulmarill
 2005-07-21 13:52
#56591 #56591
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
oracle wird im allgemeinen auch überschätzt :)
wenn du die daten die deine funktion zurückgibt mal überprüfen willst, kannst du das z.b. so machen:
Code: (dl )
1
2
use Data::Dumper;
print Dumper \@aa_inet_bk;

das gibt dir den gesamten inhalt des arrays aus (evtl. die ausgabe in eine datei umleiten, da das doch sehr ausführlich ist). es kann ja sein, dass der array gar nicht so aufgebaut ist, wie man das erwarten würde.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-07-21 13:56
#56592 #56592
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Außerdem würde ich
Code: (dl )
1
2
3
4
5
6
7
8
 while(my @tmp = $sth->fetchrow_array)
{
$array[$i][0] = $tmp[0];
$array[$i][1] = $tmp[1];
$array[$i][1] = $tmp[2];
$array[$i][2] = $tmp[3];
$i++;
}
etwas abändern. Hier ist wahrscheinlich ein Fehler drin, weil Du zweimal etwas $array[$i][1] zuweist. Ich würde es so schreiben:
Code: (dl )
1
2
3
4
 while(my @tmp = $sth->fetchrow_array){
$array[$i] = \@tmp;
$i++;
}
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/
subsys
 2005-07-21 15:36
#56593 #56593
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
@renee: Du hast natürlich Recht. Danke für den Tip. Es ist aber leider nicht für den Fehler verantwortlich.

Der Dumper zeigt mir folgende Ausgabe an der Maschine an welcher es nicht funktioniert:
Code: (dl )
$VAR1 = [ '52', '\'SuSEconfig: pine-notify (fwd)\'', '21.07.05 12:00', '\'root \'' ]; $VAR2 = [ '53', '\'SuSEconfig: pine-notify (fwd)\'', '21.07.05 13:16', '\'root \'' ]; 


An der Maschine wo es funktioniert wird es laut Dumper folgendermassen aufgebaut:
Code: (dl )
$VAR1 = [ [ '187', 'FW: Dies und das', '12.07.05 13:14', '"g0024" ' ], [ '188', 'FW: ***UNCHECKED*** WG: BAV Skizze', '12.07.05 13:14', '"g0024" ' ], [ '189', 'FW: Dies und das', '12.07.05 13:33', '"g0024" ' ], [ '190', 'FW: ***UNCHECKED*** WG: BAV Skizze', '12.07.05 13:33', '"g0024" ' ], [ '191', 'FW: Beispieltexte', '12.07.05 13:34', '"g0024" ' ] ];


Anscheinend wird einmal wirklich immer eine neue Variable angelegt, während beim anderen ein komplettes Array erzeugt wird.
Der Code ist identisch. Hier bin ich leider irgendwo mit meinem Latein am Ende.

Hat jemand vielleicht eine Idee, wie ich die ganze Geschichte ohne Arrays lösen kann ?
subsys
 2005-07-21 16:46
#56594 #56594
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Ok,

anscheinend gibt es auch noch ein anderes Problem. Wenn ich per $aa_inet_bk[$i][1] zugreife läuft mein Skript Amok. Das heisst das Skript läuft mit nahezu 100% CPU Zeit. Kommentiere ich diese Zeile aus, ist es wieder vorbei. Das Error_Log ist während meiner Zeit des Testens auf ca 1,5 GByte gewachsen, daher nehme ich mal an, dass ich irgendwie auf einen Bug in Perl gestossen bin.
renee
 2005-07-21 16:56
#56595 #56595
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was steht denn so im Error_log??
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/
subsys
 2005-07-21 18:02
#56596 #56596
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Das Error Log habe ich leider nicht mehr an der Hand.  Es stand leider nur ein Hinweis auf eine uninitalisierte Variable in den Zeilen 40/41... das 1,5 GByte lang, so als würde eine Endlosschleife darum herum gebaut werden. Inzwischen erhalte ich nach den Update vom mod_cgi ein "Premature end of Script headers".

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
sub get_auftraege_inetbk_html
{
# Variablen
my @aa_inet_bk;
my $aa_size = 0;
my @aa_mitte_fertig = '';
my $aa_sid = $_[0];
my $betreff;
my $content;
my $bearbeiten;
my $i=0;
my @content;
my ($mail);

# Hole die Daten aus der Datenbank
@aa_inet_bk = get_auftraege_inetbk();
push(@aa_mitte_fertig, "<h3>Mail: Internet -> BK-Netz</h3>");

# ueberschrift von der Tabelle erzeugen
my $ueberschrift="<table width=100% rules=\"all\"><tr><th>Status</th><th>Mail von:</th><th>Betreff:</th><th>Erhalten:</th><th>Gr&ouml;&szlig;e:</th><th>&nbsp;</th></tr>";

open(FH, "<templates/showauftraege_content.html");
while(<FH>)
{
 push (@content, $_);
}
close(FH);
print Dumper \@aa_inet_bk;
$i=0;

foreach (@aa_inet_bk)
{
 foreach my $item (@content)
 {
  # Status
  $item =~ s/\!\!Freigabe\!\!/OK/g;
  # Emailadresse
  #$mail = $aa_inet_bk[$i][1];
  #$mail =~ s/</&lt;/g;
  #$item =~ s/\!\!Mailadresse\!\!/$mail/g;
  # Betreff
  #$betreff = "hallo";
  #$betreff = $aa_inet_bk[$i][1];
  #print $aa_inet_bk[$i][1];
  #if (length($betreff) > 60) { $betreff = substr($betreff,0,60); $betreff .= "[..]"; }
  #$_ =~ s/\!\!Betreff\!\!/$betreff/g;
  # Zeit/Datum
  #$item =~ s/\!\!ZeitDatum\!\!/$bla/g;
  # Groesse
  #$aa_size = -s WORKDIR . "/" . SERVERID . "/A$aa_inet_bk[$i][0]/original.txt";
  #$aa_size = $aa_size / 1000;
  #$aa_size = sprintf("%.0f", $aa_size);
  #$_ =~ s/\!\!Groesse\!\!/$aa_size KB/g;
  # Bearbeiten
  #$bearbeiten = "<a href=\"main.pl?link=auftrag&SID=$aa_sid&AID=$bla\"><img src=\"/images/b_edit.png\" alt=\"Bearbeiten\" border=\"0\"></a>";
  #$item =~ s/\!\!Bearbeiten\!\!/$bearbeiten/g;
  push(@aa_mitte_fertig, $item);
  $i++;
 }
}
# Hier wird der komplette String zusammengebaut
return $content = "$ueberschrift" . "@aa_mitte_fertig" ."</table>";
}


Hier erstmal der Code meiner Funktion. Der Code ist noch ziemlicher Müll. Es geht nur um diese Zeile:
#$mail = $aa_inet_bk[$i][1]; ist diese auskommentiert, funktioniert alles. Ist das Kommentarzeichen weg erhalte ich einen 500er mit Premature End of Script headers.

Nachtrag:
Nachdem sich jetzt die Kiste verabschiedet hat, weil sie zuwenig Speicher hat, habe ich beschlossen, dass ein Bug in Perl/Apache/CGI oder sonst was ist. Ich kenn kein Skript was mehr als 512MB an Speicher braucht.\n\n

<!--EDIT|subsys|1121956117-->
ptk
 2005-07-22 13:42
#56597 #56597
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es ist mit grosser Wahrscheinlichkeit *dein* Bug, nicht der von Perl. Man muss schon ein Perl-Profi sein, um einen Perl-Bug zu finden.

Zu deinem Skript: warum lauefst gleichzeitig mit foreach ueber @aa_inet_bk und inkremetierst $i und benutzt dieses $i zum Auslesen von @aa_inet_bk? Und warum wird $i in der inneren Schleife inkrementiert?
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-07-21 12:06.