Portál AbcLinuxu, 9. května 2025 20:35

Dotaz: Perl, unicode a regexp

16.10.2008 21:58 Marek 'marx' Grác | skóre: 21 | blog: Paralelný blog | Brno / Bratislava
Perl, unicode a regexp
Přečteno: 330×
Odpovědět | Admin
Majme kód:
use strict;
use utf8;
use locale;
use XML::Simple;

binmode (STDIN, 'utf8');
binmode (STDOUT, 'utf8');  
binmode (STDERR, 'utf8');

...

$desc="kamém2,";
print "BRK2>$desc\<\n";
if ($desc =~ /žitkov..?.?\s+(ploch..? )?(dom. )?(je )?(cca )?(\d+)\s*m2/) {
    $uzitkova_plocha = $5;
} elsif ($desc =~ /ÚP:? (\d+)\s*m2/) {
     $uzitkova_plocha = $1;
}
print "BRK3\n";
V podstate veľmi jednoduchá vec, ktorá parsuje súbor tak ako má. Pri niektorých vstupoch (100% reprodukovateľné), napr. ak $desc obsahujé 'ém2,' tak to na riadku s ÚP začne cykliť a dokáže to vyťažiť jeden procesor na 100%. Riešenie (A) je zmeniť ÚP na UP - to by som chápal. Riešenie (B) je pridať k RE case insensitive flag. Napadá vás nejaké riešenie, ktoré je rozumnejšie?

Testované v perle 5.8.8 a 5.8.7
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.10.2008 23:53 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl, unicode a regexp
Odpovědět | | Sbalit | Link | Blokovat | Admin
pozrieť bugreporty a upgrade :-)
17.10.2008 08:50 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl, unicode a regexp
Odpovědět | | Sbalit | Link | Blokovat | Admin
asi to bude skutecne nejaky bug, protoze ve verzi 5.10 se to chova jak ma. imho ma problem s tim \s - dalsi zpusob jak to "obejit" je lookaround:
/ÚP:? (\d+)(?=\s*m2)/
In Ada the typical infinite loop would normally be terminated by detonation.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.