1 2
use List::AllUtils qw(first); first { $_ gt "\xff" } split //, $string_of_characters
2019-07-08T08:11:08 GwenDragonSowas würde ich nehmen:
scalar grep /[^\0-\x{ff}]/, $string;
Editiert von GwenDragon: Tippfehler bei Regex
print scalar grep /[^\0-\x{ff}]/, decode_utf8 "€";
1
2
3
4
Benchmark: timing 10000 iterations of daxim, gwen , muffi,...
daxim: 14.6732 wallclock secs (14.41 usr + 0.18 sys = 14.59 CPU) @ 685.40/s (n=10000)
gwen : 0.830139 wallclock secs ( 0.82 usr + 0.00 sys = 0.82 CPU) @ 12195.12/s (n=10000)
muffi: 0.690399 wallclock secs ( 0.68 usr + 0.00 sys = 0.68 CPU) @ 14705.88/s (n=10000)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
use 5.020; use List::AllUtils qw(first); use Encode; use utf8; use Benchmark ':hireswallclock'; sub daxim { my $string_of_characters = shift; first { $_ gt "\xff" } split //, $string_of_characters; } sub muffi { my $str = shift; $str !~ /^[\x{00}-\x{ff}]*$/; } sub GwenDragon { my $string = shift; scalar grep /[^\0-\x{ff}]/, $string; } my $string = 'a' x 10000 . '€'; say "daxim: ", encode('UTF-8',daxim($string)); say "muffi: ", muffi($string); say "GwenDragon: ", GwenDragon($string); timethese(10000, {'daxim' => sub { daxim($string) }, 'muffi' => sub { muffi($string) }, 'gwen ' => sub { GwenDragon($string) }, }, );
2019-07-08T08:56:10 hajMessen können wir.
QuoteUse of uninitialized value in say at test.pl line 46.
use feature qw/:5.10/;
2019-07-08T09:07:42 biancaDeswegen dauert's bei mir manchmal etwas länger mit der Antwort.2019-07-08T08:56:10 hajMessen können wir.
Cool danke dir!
Hatte auch kurz an eine Messung gedacht aber den Code dafür nicht zur Hand.
2019-07-08T09:07:42 biancaSo sieht's aus. Der Code von GwenDragon ist allerdings kaum messbar langsamer.Das heißt, muffi ist der schnellste? Sehe ich das richtig?
2019-07-08T09:07:42 biancaMit dem Code stimmt was nicht!
Bei mir mit Perl This is perl 5, version 18, subversion 4 (v5.18.4) built for MSWin32-x64-multi-thread kommtQuoteUse of uninitialized value in say at test.pl line 46.
Diese Zeile ist: say "daxim: ", encode('UTF-8',daxim($string));
Woran liegt das?
my $string = 'a' x 10000 . "\N{EURO SIGN}";
2019-07-08T09:39:27 hajUnd er funktioniert ohne ein Extra-Modul (List-AllUtils ist ja nun nicht Core), sowas ist manchmal nicht unwichtig.Der Code von GwenDragon ist allerdings kaum messbar langsamer.
2019-07-08T10:04:53 GwenDragonUnd er funktioniert ohne ein Extra-Modul
2019-07-08T09:39:27 hajDu solltest die Zeile 22 so schreiben:
Code (perl): (dl )my $string = 'a' x 10000 . "\N{EURO SIGN}";
2019-07-08T09:39:27 haj...und auch das use utf8 rauswerfen, wenn Dein Editor nicht als UTF-8 abspeichert.
2019-07-08T08:56:10 hajAutsch, eben mal schnell reingestippt, danke für den Hinweis.Eine kleine Korrektur habe ich vorgenommen: Bei GwenDragon's Methode muss \0 anstelle von 0 rein, sonst verpasst Du die versammelten Satzzeichen.
2019-07-08T17:17:20 biancaKeine Ahnung was du meinst. Aber mach dir keine Sorgen. Es geht hier um eine reine Fun Anwendung die aus allen möglichen Quellen mit unbekannten Zeichensätzen Daten einliest und halbwegs brauchbar speichern soll. Dafür soll schlussendlich auch "Wide character in print..." vorgebeugt werden.
Danke dir
use bytes;
2019-07-09T06:21:12 rostiNein, weil ich wissen möchte, wenn da sowas kommt.Vor jeder Printausgabe ist die Kodierung also auszuschalten dann kommt auch diese Meldung nicht mehr.
2019-07-09T06:21:12 rostiIch schalte nichts ein und nichts aus. Daten kommen über LWP::UserAgent rein.Ich frage mich auch welche Kodierung Du einschaltest wenn die Zeichensätze unbekannt sind.
2019-07-09T07:46:50 rostiIch schrieb nicht, dass sie aus ist sondern dass ich sie weder ein- noch ausgeschaltet habe.Die Kodierung ist bei Dir eingeschaltet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#!/usr/bin/perl use warnings; use strict; use Inline 'C'; my $text = "ASCII-Wort"; my $umlaute = "Ölmüller"; my $euro = "\N{EURO SIGN}"; print checkBeyondOrd($text) . "\n"; print checkBeyondOrd($umlaute) . "\n"; print checkBeyondOrd($euro) . "\n"; __END__ __C__ int checkBeyondOrd(char *a) { while (*a != 0) { if (*a < 0) { return 1; } a++; } return 0; }
my $euro = "\N{EURO SIGN}";
2019-07-10T17:08:02 Gustl==> msg #190193Hallo, ich bin neugierig und würde gerne wissen wozu man sowas brauchen könnte? :)