Schrift
[thread]7842[/thread]

Dateihandling



<< >> 9 Einträge, 1 Seite
StefanJ
 2006-03-30 19:27
#64215 #64215
User since
2005-05-03
35 Artikel
BenutzerIn
[default_avatar]
Hi,
Ich hab folgendes Problem:
Bei jedem Durchlauf eines Perl-Skriptes wird die Ausgabe in eine Textdatei geschrieben. Durch den ">>" Operator wird diese Ausgabe jedesmal in der Datei unten dran gehängt. Ich möchte nun aber dass die letzte Ausgabe des Skriptes oben in der Textdatei steht. Wie macht man so was am geschicktesten ??
Und viell.könnt ihr mir noch sagen, ob man Wörter formatiert,also z.B. "fett", in die Textdatei ausgeben lassen kann ?!

Danke,

Gruß
Crian
 2006-03-30 19:35
#64216 #64216
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Wie du die Wörter formatierst hängt vom Format deiner Textdatei ab. Wenn es eine HTML-Datei werden soll nimm

Code: (dl )
<strong>Wort</strong>


ist es eine LaTeX-Datei, nimm entsprechend

Code: (dl )
{\bf Wort}


Zum Dateiumdrehen fällt mir nur einlesen in ein Array und verkehrtherum ausgeben ein. Dazu muss die Datei in den Speicher passen. Oder nimm tie.
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
Dubu
 2006-03-30 23:03
#64217 #64217
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Crian,30.03.2006, 17:35]ist es eine LaTeX-Datei, nimm entsprechend

Code: (dl )
{\bf Wort}
[/quote]
Bitte diese alte Syntax begraben. LaTeX 2.09 ist seit 12 Jahren überholt.
Code: (dl )
\textbf{Wort}
Dubu
 2006-03-30 23:12
#64218 #64218
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Also, wenn es wirklich nur (ASCII-)Text ist, dann gibt's sowas wie "fett" nicht.

Für das "oben anfügen" würde ich auch Tie::File empfehlen. Es gibt keine Möglichkeit, das mit einfacher Redirection zu erledigen, weil es eine sehr aufwändige Operation ist - es muss für jede neue Zeile die ganze Datei umkopiert werden.
sid burn
 2006-03-31 00:11
#64219 #64219
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Eine einfache Implementation wäre, wenn du die komplette Datei in einem Array einliest, und dann von der ersten Zeile vom Zeilenanfang eine Substitution machst, und dort dann dein gewünschten Text einfügst.

Ob das unbedingt ein so guter weg ist sei mal dahingestellt. Die komplette Datei muss auch komplett im Speicher eingelesen, und neu geschrieben werden.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w

die "Zu wenig Parameter\n" if @ARGV <= 0;

for (@ARGV)
{
open READ, "<", $_ or die $!;
@f = <READ>;
close READ;

$f[0] =~ s/^/Hiermit füge ich oben etwas hinzu\n/;

open WRITE, ">", $_ or die $!;
print WRITE @f;
close WRITE;
}
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Relais
 2006-03-31 00:20
#64220 #64220
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sid burn,30.03.2006, 22:11]Ob das unbedingt ein so guter weg ist sei mal dahingestellt.[/quote]
Das Prinzip ist nur gut, wenn die Datei mit sicherheit klein ist und klein bleibt. Ansonsten siehe Dubus Hinweis auf CPAN:Tie::File bzw. meine Sig.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
StefanJ
 2006-03-31 16:03
#64221 #64221
User since
2005-05-03
35 Artikel
BenutzerIn
[default_avatar]
Alles Klar, Danke.

Ich denke dann müssen die "armen" User wohl die Textdatei nach unten scrollen um die neusten Änderungen zu sehen...;)

Gruß
Crian
 2006-03-31 16:04
#64222 #64222
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
[quote=Dubu,30.03.2006, 21:03][quote=Crian,30.03.2006, 17:35]ist es eine LaTeX-Datei, nimm entsprechend

Code: (dl )
{\bf Wort}
[/quote]
Bitte diese alte Syntax begraben. LaTeX 2.09 ist seit 12 Jahren überholt.
Code: (dl )
\textbf{Wort}
[/quote]
Interessant. 2.09 war state of the art als ich LaTeX kennen gelernt hab.
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
master
 2006-03-31 16:21
#64223 #64223
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Wenig Daten:
Wenn es wenige Daten sind dann mach es wie vorgeschlagen:
alte einlesen komplett und neue daten darüber, dann alte.


Viel Daten:
Anstatt die alte komplett zu laden, dann anhängen und zu überschreiben, kannst du es auch step by step machen..

1. Schreib zuerst die neuen Daten in eine neue Datei (z. B. Temp.txt)

2. Dann öffnest du die alte datei und hängst dann mit syswrite() Byteweise (Und der App-Konstante), die alte an die neue dran.

3. Am Schluss, alte löschen, und temp in alte umbennen..

So ersparst Du es dir, an den Anfang der Datei zu schreiben.
dies kostet meist viel performance da das Dateisystem alle Daten verschieben muss...  Am Ende Anhängen geht meist einfacher als am Anfang.\n\n

<!--EDIT|master|1143807820-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
<< >> 9 Einträge, 1 Seite



View all threads created 2006-03-30 19:27.