PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl - Daten ausgeben



RAHUL
07-06-2006, 14:58
Hallo,

ich habe mir gerade die Grundkenntnisse in Perl zugelegt
und versuche mein erstes eigenes kleines "Textverarbeitungs"-Programm.

Ich habe dabei folgendes kleines Problem
Ich lese eine Datei, die ich per Argument übergeben habe,
in einen Stringarray, prinzipiell so


@data=<ARGV[$_]

Dabei lese ich nur einen bestimmten Teil ein, der per Regularexpressions
ausgewählt wird und am Ende enthält @data nur Zahlenwerte in vier Spalten.
Wenn ich die Spalten aber per

print @data ausgebe, sind die Spalten nicht ordentlich ausgerichtet,
würde ich sie aber per "printf" formatieren würde, müßte ich eine Schleife Zeile für Zeile
schreiben, sehe ich das richtig?

Also meine Schleife sehe dann so aus, die klappt aber nicht(gibt mir nur die erste Zeile aus und
beschwert sich mit "printf interpreted as function")

printf (" %2d %8.5f %8.5f %8.5f\n" , split) foreach($data[0] .. $data[-1]);

Was ist falsch daran oder gibt es vielleicht auch noch einen schöneren Weg(für Anfänger nachvollziehbar),
irgendwie empfinde ich die Schleife als nicht so schön? ;)

Mfg und Danke

Rahul

Molaf
07-06-2006, 15:34
Wenn Du statt des voreingestellen Leerzeichens bei der Ausgabe eines Arrays zwischen den Elementen lieber etwas anderes hättest, eines Zeilenumbruch etwa, dann setze einfach:
$, = "\n";


mfg
Molaf

RAHUL
07-06-2006, 15:52
Hallo,

Danke für die Antwort(wieder einen kleinen Fitzel gelernt :) ),
aber das hilft mir nicht weiter, denn mein @data-Array ist ja schon voller Strings,
die ich je nach Belieben(chomp) mit oder ohne den Zeilenumbruch speichern kann.

Das Problem ist schon in den eingelesenen Datenstrings,
deren Datenelemente(unsauber formuliert) nicht ordentlich formatiert sind.

Ich habe das jetzt mit obiger Schleife hinbekommen,
wenn ich den Bereich von


$data[0] .. $data[-1]

auf


@data

ändere, wobei mir der Unterschied nicht ganz klar ist.

MfG
Rahul

RAHUL
08-06-2006, 10:28
Hallo,

weiter mit folgendem Problem,



61 my $ctr=0;
62 foreach(@Standard)
63 {
64 $_=~ s/^.*:new\s*$/\U$ARGV[$arg] :NEW\n/i;
65 if($ctr==1)
66 {
67 printf MSINDO_INP(" %2d %10.5f %10.5f %10.5f\n", 0, 0.0, 0.0, 0.0);
68 printf MSINDO_INP(" %2d %10.5f %10.5f %10.5f\n", split) foreach (@CrystalTmp);
69 }
70 $ctr++ if(m/^\s*:End\s*/);
71 print MSINDO_INP $_;
72 }


Kurz zur Erläuterung:
Ich habe zwei Text-Dateien teilweise eingelesen und möchte die jetzt miteinander in der Datei des Filehandles (MSINDO_INP) verwursten, die Information der beiden Dateien liegen jeweils in den Arrays @Standard und @CrystalTmp vor.

@Standard zeichnet sich durch mehrere Blöcke aus,
die durch ein ":End" getrennt werden, in den Block zwischen dem ersten
und zweiten ":End" soll der Inhalt von @CrystalTmp gefüllt werden(Zeile 65-70).
Zeile 64 ist unwichtig und verändert nur die Titelzeile in @Standard...

Das Programm schreibt auch bis zu dem ersten ":End",
aber dann kommt eine Fehlermeldung, mit der ich nichts anfangen kann.


Undefined subroutine &main::MSINDO_INP called at ./Test1.pl line 67.


Kann mir jemand erklären, was da schief geht.
EDIT:
Es scheint irgendetwas mit der Funktion printf bei Anwendung auf einen FILEHANDLE
tun zu haben, aber wie kann ich das beheben?

Danke

Rahul

mcspam
08-06-2006, 15:35
Undefined subroutine &main::MSINDO_INP called at ./Test1.pl line 67.
Kann mir jemand erklären, was da schief geht.
perldoc printf (http://perldoc.perl.org/functions/printf.html)


printf MSINDO_INP(" %2d ....

muss so aussehen:


printf MSINDO_INP " %2d ..."

jetzt eine andere Frage:



@data=<ARGV[$_]

gibt es wirklich so eine vereinfachte Syntax um Dateien einzulesen?
oder meintest du


open(FH, '<', ARGV[$_]);
@data = <FH>;
close(FH);

damit?

Gruß

RAHUL
09-06-2006, 09:28
Hallo,

ich habe noch mal ein wenig mit "printf" herumprobiert,
es geht auch mit der Klammer,
aber es muß ein Leerzeichen nach dem Filehandle eingeschoben werden...


gibt es wirklich so eine vereinfachte Syntax um Dateien einzulesen?
oder meintest du ...

ja, stimmt, ich meinte das so, wie du es geschrieben hast....

MfG
Rahul