Anett: farbiger Text

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

  1. 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

    --
    Ein japanisch-deutsches Gedicht
    sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
    1. 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

      1. 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

        --
        Ein japanisch-deutsches Gedicht
        sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
  2. 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

    1. 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

      1. 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

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. 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

          1. 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

            --
            Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
            1. 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

              1. 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

                --
                Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                1. 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.

                  1. 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

                    --
                    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
                    1. 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