- 论坛徽章:
- 0
|
原帖由 liang573728 于 2007-12-13 09:20 发表 ![]()
学习了,大虾能否解析下?看不懂
设计思路是:
根据所处理字符串的特点, 将其分解成 "括号前" "某个括号住的内容" "括号后"三部分; 分别处理前后两部分,再与不处理的括号部分拼接而成.
这里说的"括号前""括号后" 是针对某一个括号而言的 , 这两个部分本身还可能包含其他括号 . 那么继续层层划分直到剩下的部分不再有括号.
这种特点最容易用"递归"实现. 上面代码中 handle 就是一个递归函数.
17 if ($tmp =~ /([^\(]*)(\(.*?\))(.*)/s) {
18 &handle ($1) . $2 . &handle ($3) ;
就把要处理的串分解成: 括号前$1 部分 , 括号及括住内容部分$2 , 括号后$2部分.
前后两部分要处理 , 所以用了handle . 18 行把处理完的部分和原来的$2部分拼接完后返回.
17,18 完成拆解和再拼接,真正的转化是在被分解的部分不再含有"括号"后进行的:
19 } else {
20 $tmp =~s/([[ digit:]]{2})/chr(oct("0x$1" )/ge ;
21 $tmp ;
22 }
针对串:
(CAD)是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。
第一层调用handle , 将以"(CAD)"为界将整串拆成:
1.1 " "
1.2 "(CAD)"
1.3 "是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。"
3个部分. 对1和3再调用handle分别处理.
对上面1的 " "串 , 由于已经没了括号 , 所以再次handle处理时,将执行:
19 } else {
20 $tmp =~s/([[ digit:]]{2})/chr(oct("0x$1" )/ge ;
21 $tmp ;
22 }
对上面3的 "是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。"
其实形式和没有分解前没什么两样 , 再次使用handle分解成:
2.1 "是计算机重要应用领域,它的含义是"
2.2 "(______)"
2.3 "。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。"
2.1直接处理,2.3再用handle.
如此下去,最终会被分解到最后一个"。" 至此分解和处理过程结束,接下来就是层层拼接返回的过程.
这样解释不知道有没有道清楚. 我是以其他语言的思路来写的 , 我是perl新手 . perl语法方面的,还是请"flw""Lonki"等perl大牛们来释疑. |
|