27 September 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

简述

我用不太习惯 Kwiki 或 Textile 格式。以为我经常要用到模块,所以我更喜欢将
L<Perl6::Rules> 直接映射到 http://search.cpan.org/perldoc?Perl6::Rules

或者我拥有一些朋友,如果程序能自动映射他们的名字到他们的主页那将是比较美好的一件事。
当然还有很多。这些毫无疑问属于定制/customize, 只好自己写代码了。

写这些东西无非是正则表达式替换而已。于是想着试试 Perl6 代码。到 CPAN 上下了 Damain Conway 的 Perl6::Rules 回来。实话说,这模块真是很混,没有很好的完成 Perl6 的 Grammar & Rule, 写起来及其不顺手。
也没啥好办法,只好先折腾了。权当练习 Perl6 了。
说实话,我水平也不咋的。这练习也不考虑什么性能或者更简练的方法了。如有错误可以发 mail 给我。 Thanks.

Exercise

首先来完成自动映射模块:
$text =~ s:g{
(<ws>)L\<([\w|\:]+)\>(<ws>)
}{
$1<a href="http://search.cpan.org/perldoc\?$2">$2</a>$3
};

简单解释下代码:s:g{}{}; 是 s{}{}g 的新版。
<ws>
是一个 rule, 表示空白(可以匹配新行)。

其次来实现常用字映射:

my %mapping_word = (
'chunzi.org">chunzi' => 'blog.chunzi.org',
'joe jiang' => 'www.livejournal.com/users/joe_jiang/',
'cnhackTNT' => 'www.wanghui.org',
'CPAN' => 'search.cpan.org',
);
# my/our/local $p; IS FAILED!
# BE CAREFUL! must be $main::p!
foreach $main::p (keys %mapping_word) {
$text =~ s{\b$::p\b}{<a href="http://$mapping_word{$main::p}">$main::p</a>};
}

本应该先用 split 将 $text 按词分开,然后用 map 将词替换再 join 回去。这应当比正则要效率高一点。
这里有一让我感到混的就是 my/our $p; 怎么都不行,害我调试了老半天才知道。郁闷。
简单解释下代码:这里的 $::p 是变量内插。在 Perl6::Rules 里变量内插必须是 $:: @:: %:: 什么的。
另外注意的是要 $main::p; 不能用 my/our/local $p;
变量内插的是 main 里的变量。而不是当前包的变量。

我比较喜欢 Kwiki 的 = == === ====
变量内插尽然在下面的代码中运行不起来:

# = H1 == H2
# YAP!! FAILED!!!
#for my $n (1 .. 4) {
# $text =~ s:g{[^|\n]=<$::n><ws>(.+?)\n}{\<h$n>$1</h>};
#}
$text =~ s:g{[^|\n]=<1><ws>(.+?)\n}{\<h1>$1</h1>};
$text =~ s:g{[^|\n]=<2><ws>(.+?)\n}{\<h2>$1</h2>};
$text =~ s:g{[^|\n]=<3><ws>(.+?)\n}{\<h3>$1</h3>};
$text =~ s:g{[^|\n]=<4><ws>(.+?)\n}{\<h4>$1</h4>};

迫不得已只好重复写了四次。:(

其他的一些诸如 URL映射,code 代码块 < 自动替换啥的也不说了。有些类如 * li 的也还没实现。
革命尚未成功,同志还需努力呀。



blog comments powered by Disqus