farbiger Text
Anett
- perl
Hallo!
Ich möchte mit einem Perl-Skript verschiedene Textdateien erstellen, in denen einige Werte farbig seien sollen. Geht das? Wenn ja, wie?
Ich habe es sowohl mit dem Modul ANSIColor versucht, das funktioniert aber nicht, da ich unter Windows XP arbeite...(also, ich glaube, dass es daran liegt) und mit dem Modul ColorOutput, da seh ich die Farben zwar in der Konsole, kann sie aber nicht in eine Datei schreiben, da der Befehl cprint irgendwie nicht für Dateihandles geht?!
Ich weiß jetzt irgendwie nicht, was ich noch ausprobieren könnte... Hat jemand eine Idee?
Danke schon mal im Voraus! ;-)
Anett
Hallo!
Ich möchte mit einem Perl-Skript verschiedene Textdateien erstellen, in denen einige Werte farbig seien sollen. Geht das?
Unabhänig von Perl: Nein, das geht nicht. Reine Textdateien (*.txt) können keine Formatierungen speichern, sondern nur Text. Also solltest du keine txt-Dateien erstellen sondern irgendwelche andere :)
ciao, ww
Ohha...
Reine Textdateien (*.txt) können keine Formatierungen speichern, sondern nur Text. Also solltest du keine txt-Dateien erstellen sondern irgendwelche andere :)
Wie war das - es gibt keine dummen Fragen?! *schmunzel* Und welche Dateiformate speichern Formatierungen mit ab? Kann ich diese Dateien dann auch mit Perl erstellen?
Grüße. Anett
Hallo!
Wie war das - es gibt keine dummen Fragen?! *schmunzel* Und welche Dateiformate speichern Formatierungen mit ab? Kann ich diese Dateien dann auch mit Perl erstellen?
*.doc, *.odt, *.rtf usw. :-) Welche du mit Perl erstellen kannst, kann ich dir nicht sagen. Aber die Antwort wirst du evtl. hier, bei Google oder in einem speziellen Perl-Forum finden.
ciao, ww
Hallo,
eine Farbformatierung an der Konsole hat die Form "\033[{$farbreferenz}m{$string}"
(für das Zeichen \033 kennt perl auch Zeichenfolge \e). Eine Farbformatierung wird mit "\033[00m"
aufgehoben.
Praktischgesehen bedarf es also der Module nicht.
Farbreferenz:
Attribute codes:
00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
Text color codes:
30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
Background color codes:
40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
print "eddi macht heute \033[01;05;34m???\033[00m";
Dementsprechen kannst Du diese Formatierung auch in eine Textdatei schreiben. Wird sie ausgelesen und zu Anzeige gebracht, wird der Text farbig angezeigt.
Gruß aus Berlin!
eddi
gudn tach
print "eddi macht heute \033[01;05;34m???\033[00m";
mit
v5.8.7 built for cygwin-thread-multi-64int
geht das bei mir, aber mit dem perl, dass ich direkt unter windows 2000 installiert habe, also
v5.8.8 built for MSWin32-x86-multi-thread,
erscheint bloss:
eddi macht heute ←[01;05;34m???←[00m
was muss ich'n da machen, damit auch das windows-perl "bonndisch" wird?
prost
seth
was muss ich'n da machen, damit auch das windows-perl "bonndisch" wird?
Windows NT und höher unterstützen die ANSI-Escapesequenzen nicht, du musst also ein Modul nehmen, z.B. Win32::Console::ANSI.
Siechfred
gudn tach Siechfred!
Windows NT und höher unterstützen die ANSI-Escapesequenzen nicht, du musst also ein Modul nehmen, z.B. Win32::Console::ANSI.
funzt! cool! bunt!
weiss jetzt noch jemand, wie man die aktuellen farben der console eruiert?
prost
seth
weiss jetzt noch jemand, wie man die aktuellen farben der console eruiert?
So 'funzt' das zumindest unter Win2k:
use strict;
use diagnostics;
use Win32::Console;
# Farbcodes, siehe in der Hilfe
# zu Windows zum color-Befehl
my %colors = ( '0' => 'Schwarz',
'1' => 'Dunkelblau',
'2' => 'Dunkelgruen',
'3' => 'Blaugruen',
'4' => 'Dunkelrot',
'5' => 'Violett',
'6' => 'Ocker',
'7' => 'Hellgrau',
'8' => 'Dunkelgrau',
'9' => 'Blau',
'A' => 'Gruen',
'B' => 'Zyan',
'C' => 'Rot',
'D' => 'Magenta',
'E' => 'Gelb',
'F' => 'Weiss'
);
my $console = Win32::Console->new;
my $default_dec = ($console->Info())[4];
my $default_hex = sprintf "%02X", $default_dec;
my @color = split //, $default_hex;
print $colors{$color[1]}, ' auf ', $colors{$color[0]};
Das eklige dabei ist, dass als Attributwert eine Dezimalzahl geliefert wird, die du erst noch nach hexadezimal umwandeln musst, bevor du die Hexwerte mit dem Farb-Hash abgleichen kannst. Und richtig nervig ist, dass schwarzer Hintergrund Standard ist und somit als Farbwert regelmäßig unterschlagen wird.
Siechfred
gudn tach!
So 'funzt' das zumindest unter Win2k: [...]
ah, fein! ohne dein beispiel haette ich das manual zu Win32::Console wohl nicht kapiert. wer vermutet schon, dass mit "attributes" nur die farben gemeint sind...
jetzt wusste ich nur noch gern, wie das gleiche unter linux geht. schade, dass es da nicht ein modul fuer beides gleichzeitig zu geben scheint.
noch ein paar anmerkungen zu deinem beispiel:
my $default_dec = ($console->Info())[4];
etwas uebersichtlicher waere wohl
$console->Attr()
was afais das gleiche ist.
my $default_hex = sprintf "%02X", $default_dec;
my @color = split //, $default_hex;
[...]
Das eklige dabei ist, dass als Attributwert eine Dezimalzahl geliefert wird, die du erst noch nach hexadezimal umwandeln musst, bevor du die Hexwerte mit dem Farb-Hash abgleichen kannst.
hmm, muss man aber nicht explizit umwandeln. man koennte einfach von vornherein binaer rechnen:
my $fg = $default_dec & 0xf; # oder halt & 0b1111
my $bg = $default_dec>>4 & 0xf;
und das color-array (oder hash, ist hier egal) koennte man ueber die variablen ($FG_BLACK, ...) fuellen.
was jetzt uebersichtlicher ist, darueber laesst sich nur streiten.
prost
seth
my $default_dec = ($console->Info())[4];
etwas uebersichtlicher waere wohl
$console->Attr()
was afais das gleiche ist.
In der Tat, ja. Ich habe das Ganze aus (m)einem Konsolenscript rauskopiert und reduziert, dort brauchte ich nicht nur die Farbattribute, deshalb Info().
hmm, muss man aber nicht explizit umwandeln. man koennte einfach von vornherein binaer rechnen:
my $fg = $default_dec & 0xf; # oder halt & 0b1111
my $bg = $default_dec>>4 & 0xf;
Naja, das binäre Rechnen (unter Perl) ist nicht so mein Ding, wenn du mir da noch auf die Sprünge helfen könntest.
was jetzt uebersichtlicher ist, darueber laesst sich nur streiten.
Ach was, wer will denn zanken :)
Siechfred
gudn tach!
hmm, muss man aber nicht explizit umwandeln. man koennte einfach von vornherein binaer rechnen:
my $fg = $default_dec & 0xf; # oder halt & 0b1111
my $bg = $default_dec>>4 & 0xf;
Naja, das binäre Rechnen (unter Perl) ist nicht so mein Ding, wenn du mir da noch auf die Sprünge helfen könntest.
das binaere rechnen laeuft syntaktisch in perl eigentlich genauso wie in c/c++.[1]
die dos-farben (fg und bg) sind in einer 8-bit-variablen gespeichert, wobei die niederwertigen 4 bits die vordergrund- und die hoeherwertigen 4 bits die hintergrundfarbe beschreiben.
genaugenommen stehen die vier bit jeweils fuer blau, gruen, rot und intensitaet, und zwar fuer fg und bg auf gleiche weise.
abcdefgh
||||||||
|||||||fg:b
||||||fg:g
|||||fg:r
||||fg:i
|||bg:b
||bg:g
|bg:r
bg:i
wenn die hintergrundfarbe schwarz ist, dann sind die hoeherwertigen 4 bits alle 0, und bei hellgrau als vordergrundfarbe sind die drei niederwertigsten bits alle 1, also
00000111 = 7
um nun die vordergrundfarben-nummer (0..15) zu bestimmen, muss man bloss die niederwertigen 4 bit betrachten
abcdefgh $default_dec
AND 00001111 & 0xf
= 0000efgh irgendwas aus 0..15
bei der hintergrundfarbe muessen nun die 4 hoeherwertigen bit betrachtet werden. wenn man allerdings wieder zahlen aus 0..15 haben moechte, muessen die 4 hoeherwertigen bit um 4 bit nach rechts verschoben werden.
abcdefgh $default_dec
0000abcd >>4
und dabei faellt mir gerade auf, dass "& 0xf" hier ueberfluessig sein sollte (sowohl bei arithmetischem als auch bei logischem shift), da von links eh mit nullen aufgefuellt werden soll. also:
= 0000abcd irgendwas aus 0..15
was jetzt uebersichtlicher ist, darueber laesst sich nur streiten.
Ach was, wer will denn zanken :)
gemeint war: s/laesst/liesse/
iow: es ist geschmackssache, aehnlich wie viele code-formatierungsfragen.
prost
seth
[1] noch. so wie es aussieht, wird das in perl6 alles anders.
Naja, das binäre Rechnen (unter Perl) ist nicht so mein Ding, wenn du mir da noch auf die Sprünge helfen könntest.
das binaere rechnen laeuft syntaktisch in perl eigentlich genauso wie in c/c++.[1]
[...]
Danke für die Erklärung.
[1] noch. so wie es aussieht, wird das in perl6 alles anders.
*grmpf* wollen die denn Autodidakten wie mich vergaulen?
Siechfred
gudn tach!
[1] noch. so wie es aussieht, wird das in perl6 alles anders.
*grmpf* wollen die denn Autodidakten wie mich vergaulen?
perl 5 wird nicht sofort ausgerottet.
http://dev.perl.org/perl6/faq.html?#Will_I_be_able_to_convert_my_Perl_5_programs_to_Perl_6?
prost
seth