\W versus [\W]

Honza Pazdziora adelton na fi.muni.cz
Čtvrtek Listopad 19 20:04:52 CET 2009


On Thu, Nov 19, 2009 at 10:08:22AM +0100, Jan Kasprzak wrote:
> 	Tusite nekdo proc se \W chova jinak uvnitr [ ]?
> 
> $ perl -Mutf8 -e '$a="á"; print "BAD\n" if $a=~/[\W]/'
> BAD
> $ perl -Mutf8 -e '$a="á"; print "BAD\n" if $a=~/\W/'
> $
> 
> Pokud v $a je "a" misto "a s carkou", chova se to dobre v obou pripadech.

Je to divné, protože to dává dokonce i

$ perl -Mutf8 -e '$a="á"; print "BAD\n" if $a=~/^[\W]$/'
BAD

-- říkal jsem si, že se tam třeba nějak špatně chytne backtracking a
skočí na ten druhý bajt, ale evidentně to tak není. Skoro bych to viděl
na perlbug.

Řešení by pravděpodobně mohlo být přes \p, čili pokud je zadání toto ...

> 	Co ve skutecnosti potrebuju je matchovat nepismenne znaky
> a navic podtrzitko. Cili jsem mel snahu delat [_\W]+. Nicmene na ne-ASCII
> znacich se to chova divne. Prisel jsem jen na workaround (?:\W|_) misto [_\W].

... tak

$ perl -Mutf8 -e '$a="á"; print "BAD\n" if $a=~/[\P{alpha}_]/' 

Pokut ty nepísmenné chceš zároveň ne-alpha a zároveň ne-number, tak si
budeš muset zadefinovat vlastní property. Pak to (?:\W|_) ale zase
nemusí být tak špatné. ;-)

-- 
--------------------------------------------------------------------------
  Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Satellite, Spacewalk | Only self-confident people can be simple.


Další informace o konferenci Perl