PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl-Problem



antimon
05-02-2000, 21:39
Hi,

jetzt frage ich doch mal euch, bevor ich meinen Rechner zerhacke ;-)

Ich schaffe es einfach nicht, aus einer Datei ein gescheites Array zu basteln.

Für eine Webseite habe ich eine Datenbank, in die angemeldete Benutzer eingetragen werden.
Sie hat folgendes System:

Username:Mailadresse:Sonstige_Daten

Ich lese die Datei mit

open(DATEI, "/pfad/datenbank.txt");

ein und übergebe die Daten mit

@rohdaten = <DATEI>;

an ein Array. Danach werden die durch Doppelpunkte getrennten Datenbankeinträge in ein Array geschrieben, nachdem sie getrennt wurden:

foreach $user (@rohdaten)
{
@users_split = split(/:/, $user);
push(@users, users_split);
}

Dies funktioniert auch wunderbar, allerdings sind die Benutzerdaten in der Datenbank durch einen Zeilensprung getrennt. Wie bekomme ich diesen weg??
Ich habe schon alles mögliche versucht, da ich mich aber gerade erst in Perl einarbeite, bin ich auch noch nicht so weit gekommen...

Das Ziel des Programms soll es sein, die Benutzerdaten aus einer Datenbank zu lesen und sie in Form einer Tabelle auf einer Webseite darzustellen.

Vielleicht gibt es etwas besseres, als ich oben geschildert habe, aber ich möchte halt soweit kommen, dass ich die Daten extrahiert habe und dann mit dem Schreiben in eine Webseite beginnen kann.

Hat jemand ne Lösung für mich??

Thx,
Antimon

robert
06-02-2000, 02:47
Hallo!

Ich bin mir nicht ganz sicher was du mit "Zeilensprung" meinst, aber hier mal ein Vorschlag für dein Problem.

Im Prinzip kannst du (bei deinen Daten Username, Email-Adr. und Sonstiges) mit einem normalem Array und zwei assoziativen Arrays arbeiten.



@UserName = ();
%MailAdr = ();
%Sonstiges = ();

@rohdaten = &lt;DATEI&gt;

# Daten in Array(s) eintragen
foreach (@rohdaten)
{
chomp($_);
my ($lUserName,$lMailAdr,$lSonstiges) = split(/:/, $_);
$MailAdr{$lUserName} = $lMailAdr;
$Sonstiges{$lUserName} = $lSonstiges;
push(@UserName, $lUserName);
}

# Daten wieder aus Array(s) holen
foreach $lUser (@UserName)
{
print "Name: $lUser, E-Mail: $MailAdr{lUser}, Sonstiges: $Sonstiges{$lUser}\n";
}



Gruß

Robert

antimon
25-02-2000, 22:37
Danke schön,

das klappt wunderbar...

Nur, wie kann ich einen Wert runden?

Teile ich 10 durch 3 kommt ja ungefähr 3.33333333333 raus.
Wenn ich aber nur zwei gültige Stellen haben will, was mache ich dann (z.B. 3.3)?

Ich will nämlich die Breite einer Grafik auf einer Webseite (eine Tabelle) variabel gestalten, aber es kommt halt blöd wenn im "td"-Tag drinsteht width="3.3333333333"
http://www.linuxforen.de/ubb/wink.gif

Thx,
Antimon

pitu
27-02-2000, 13:02
Original erstellt von antimon:
Hi,


foreach $user (@rohdaten)
{
@users_split = split(/:/, $user);
push(@users, users_split);
}

Dies funktioniert auch wunderbar, allerdings sind die Benutzerdaten in der Datenbank durch einen Zeilensprung getrennt. Wie bekomme ich diesen weg??

Thx,
Antimon

Schau Dir mal den Befehl "chomp" an.

thorsten

Viele Gruesse von der Cebit


------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg

robert
27-02-2000, 18:20
Thorsten,

siehe oben (mein kleines Beispiel!) http://www.linuxforen.de/ubb/wink.gif

Robert

robert
27-02-2000, 18:33
Antimon,

wegen dem Stellen-Problem! Du willst ja nur die ganze Zahl ausgeben, nicht die Nachkomma.



$I=10
printf "$I / 3 = %d\n", $I/3;


Wäre eine Lösung für die Ausgabe.

Gruß

Robert

antimon
27-02-2000, 20:35
Hört sich schon sehr gut an.

Leider kann ich damit nicht sehr viel anfangen.

Könntest du mir bitte nur so in etwa erklären, was die einzelnen Befehle machen oder bedeuten??

Thx,
Antimon

robert
28-02-2000, 15:55
Hallo!

Im prinzip ist es nur 1 (EINE) Funktion, und zwar printf. Dies ist praktisch das gleiche printf wie in C und macht nix anderes als einen Format-String zu interpretieren und die folgenden Parameter entsprechend einzusetzen.

%d bedeutet es soll eine dezimale Ganzzahl (%i für integer) an dieser Stelle ausgegeben werden, welcher als weiterer Parameter folgt.
Die Parameter die im String interpretiert werden, folgen dem String als einzelne Parameter im Auftreten von Links nach Rechts.
Man, ich glaub der Satz war etwas zu umständlich... http://www.linuxforen.de/ubb/wink.gif

Ich hätte es auch so schreiben können:



$n=10/3;
printf "%d\n", $n;


oder



printf "%d\n", 10/3;


Schau dir einfach mal die Dokumentation zu der C Funktion printf (stdio.h) an.
Sollte in jedem C Lehrbuch beschrieben stehen.

Viele Funktionen von Perl setzen einfach auf die entsprechenden C-Funktionen mit den gleichen Parametern, etc. pp., auf.

Gruß

Robert

pitu
28-02-2000, 18:02
Original erstellt von robert:
Thorsten,

siehe oben (mein kleines Beispiel!) http://www.linuxforen.de/ubb/wink.gif

Robert

Ja, hab ich letztens auch gemerkt, wer lesen kann ist klar im Vorteil.

thorsten ;-)


------------------
Thorsten Wandersmann
SuSE GmbH, Nuernberg

robert
28-02-2000, 19:59
Thorsten, geht mir aber auch oft so! http://www.linuxforen.de/ubb/eek.gif

Antimon, schau mal auf http://linux.as-rsi.de/ im Download-Bereich und hol dir dort mal BigBrother-0.x.x.tar.gz!
Da sind einige Sachen drin, die dir vielleicht helfen können.

Gruß

Robert

antimon
28-02-2000, 20:21
Danke für Eure Mühe!

Hat mir seehr geholfen.

Cu,
Antimon

robert
29-02-2000, 04:58
Kleiner Nachtrag:

Da ich festgestellt habe, das es ein Network Monitoring System (wohl auch Perl und HTML) gibt, das etwas umfangreicher ist und auch BigBrother heißt, habe ich mein BigBrother in LittleBigBrother umbenannt.

Das Tar-File ist also unter LittleBigBrother-0.3.6.tar.gz zu finden (jetzt mit Prozentangaben und etwas grafisch aufgewertet http://www.linuxforen.de/ubb/smile.gif).

Robert


[Diese Nachricht wurde von robert am 29. Februar 2000 editiert.]