Schrift
[thread]6636[/thread]

HEX Zahlen für HTML-Farbcodes ausgeben



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
format_c
 2005-01-19 10:15
#50839 #50839
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi,

Ich habe ein script was mir die Datei rgb.txt ausließt, die Dezimalwerte in Hexumrechnet und ausgibt.

Das mache ich so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use strict;

open RGB,'<','c:/cygwin/usr/X11R6/lib/X11/rgb.txt' or die $!;
while (my $line = <RGB>) {
 next if $line =~ m/^\s*$/;
 next if $line =~ m/^(?:!|#)/;
 my ($r,$g,$b,$name) = $line =~ m/(\d+)\s+(\d+)\s+(\d+)\s+(.*)/;
 printf "#%2X%2X%2X\t%s\n",$r,$g,$b,$name;
}
close RGB;


Nur werden die Werte < 10 nicht mit einer führenden "0" ausgegen, was ja auch mathematisch unsinnig ist.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
...
...
#A9A9A9 dark gray
#A9A9A9 DarkGray
# 0 08B dark blue
# 0 08B DarkBlue
# 08B8B dark cyan
# 08B8B DarkCyan
#8B 08B dark magenta
...
...

Aber das ist nun mal HTML. Gibts einen eleganten Weg das zu lösen. Lässt sich das nicht in printf integrieren?\n\n

<!--EDIT|format_c|1106122544-->
renee
 2005-01-19 10:48
#50840 #50840
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use strict;

open RGB,'<','c:/cygwin/usr/X11R6/lib/X11/rgb.txt' or die $!;
while (my $line = <RGB>) {
next if $line =~ m/^\s*$/;
next if $line =~ m/^(?:!|#)/;
my ($r,$g,$b,$name) = $line =~ m/(\d+)\s+(\d+)\s+(\d+)\s+(.*)/;
printf "#%02X%02X%02X\t%s\n",$r,$g,$b,$name;
}
close RGB;


Einfach noch ne 0 vor jede 2...\n\n

<!--EDIT|renee|1106124567-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
format_c
 2005-01-19 10:59
#50841 #50841
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
*grrr* wie einfach. #

Danke.

Gruß Alex
Crian
 2005-01-19 18:42
#50842 #50842
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du kannst es auch komplizierter machen mit

Code: (dl )
$var = '0'x($solllaenge-length($var)) . $var;


besser? ;) :D
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
format_c
 2005-01-20 09:59
#50843 #50843
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ähm nö. Da gefält mir printf doch besser. Mich hats nur geärgert, dass ich nicht selbst drauf gekommen bin.

Gruß Alex
Taulmarill
 2005-01-20 10:55
#50844 #50844
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
TIMTOWTDI:
Code: (dl )
print unpack "H6", pack "C3", 255, 0, 100;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
format_c
 2005-01-20 15:31
#50845 #50845
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=Taulmarill,20.01.2005, 09:55]TIMTOWTDI:
Code: (dl )
print unpack "H6", pack "C3", 255, 0, 100;
[/quote]
Ist doch mal richtig interessant und war IMHO auch zu erwarten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use Benchmark;

sub use_pack {print STDERR unpack "H6",pack "C3",255,0,100;}
sub use_printf {printf STDERR "%02X%02X%02X",255,0,100;}


timethese(10_000_000,{
'Mit pack & unpack: ' => \&use_pack,
'Mit printf: ' => \&use_printf
}
);
_ _ END _ _
Benchmark: timing 10000000 iterations of Mit pack & unpack: , Mit printf: ...
Mit pack & unpack: : 2443 wallclock secs (55.91 usr + 29.84 sys = 85.75 CPU) @ 116619.44/s (n=10000000)
Mit printf: : 4394 wallclock secs (91.11 usr + 39.45 sys = 130.56 CPU) @ 76591.38/s (n=10000000)


die unpack-pack Variant ist fast doppelt so schnell wie printf

Gruß Alex
Crian
 2005-01-20 15:34
#50846 #50846
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Und was ist mit meiner Variante?
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
Taulmarill
 2005-01-20 17:22
#50847 #50847
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@Crain: naja, da deine Variante (ungewünschte) Hexvormatierung voraussetzt, dürfte die recht langsam sein, da die Eingabewerte ja dezimal vorliegen. die ergänzung kähme dann erst nach der umformatierung in hex, die ja anscheinend schon recht langsam ist. da könnte man dann eher tr/ /0/; benutzen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-01-21 01:12
#50848 #50848
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wieso Hexformatierung? Ich pack einfach dir richtige Zahl Nullen davor?!
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
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-01-19 10:15.