Blog of Ditsing

三日不读书,便觉言语无味,面目可憎

记一件naive的事儿

| Comments

最近在写一个关于课程表的程序,跟中文正则表达式打了很多交道。比如一次我需要把“周三”中的那个“三”转成数字。作为一个菜鸟Perler,我在一切可以用到正则表达式的地方放上一个正则表达式。在这儿,我非常naive的认为,中文的“三”也是一个数字,正则里的 “\d” 应该可以匹配,于是我这么写了

1
2
$week =~ s/周(\d*)/$1/;
$week = &find_num( $week);

神奇的是它居然达到了我的目的,最后我确实得到了数字3。 find_num 是个无辜的函数,它负责把“三”转成3。

于是naive的我naive的认为Perl是如此的强大,居然连中文的数字都能识别。 但是之后我用其他的代码做实验,无论是Perl 5.8, 5.10 还是5.12都匹配不上,于是我再次naive的认为只有最新的Perl 5.14才可以。直到今天我review了我的代码,用5.14测试了

1
s/周(\d)/$1/

也匹配不上!我这才突然发现了其中的问题,相信我的读者们也都看出来了。

不过话说回来,Perl的正则还是很强大的,真的是得心应手。所以我决定,就把这个bug永久留在我的代码里了。

Comments