呵呵,研究FastCGI很久没来了,再来请教一下

呵呵,研究FastCGI很久没来了,再来请教一下

呵呵,研究FastCGI很久没来了,再来请教一下
经过我编写多个程序的测试,发现FastCGI与HTML::Template联合使用时有个致命的
弱点,就是HTML::Template的判断分支语句是<TMPL_IF BOOL>,很显然它是根据
模块内的匿名散列中是否存在BOOL这个键/值对来决定是否输出HTML语句了.这在
一般的CGI编程中没什么问题,但FastCGI是一种驻留内存技术,也就是说本次运行页
面向模块传递的值始终存在,一直到FastCGI进程被杀死为止.这就导致一个很大的
问题,比如说你编写一个分页程序时,当然不希望在第一页时"上一页"还会有连接吧.
一般的做法就是判断变量$page是否为1来决定,但HTML::Template的判断分支的模
式是否存在键/值对来决定输出,那么由于你在第二页或其他页面时已经存在了这个键/值
对在第一页时也同样存在,从而导致不可预料的错误.

居于HTML::Template的以上缺点我决定自己编写一个HTML解析模块,重要要实现三个
功能:一是改用<IF self->{键} eq 值>的方式来决定HTML语句的输出,另外就是实现
多个elsif语句(在HTML::Template中是没有elsif语句的),再有就是设置一个delkey方
法,可以删除模块中匿名散列中的键/值对.

目前基本整个代码块我都写出来了,不过有个很大的问题,就是出在正则表达式上,由
于大都书籍对正则表达式的使用并不是说得很广,所以进展有点缓慢,想上来请教几个
问题:

1.正则表达式中支不支持循环的?比如说:
while ($read =~ /{VAR (\w+)}/) {
...
}
这个循环会不会把变量中的符合{VAR (\w+)}的字符都找出来.
我在程序中使用这个语句可以把符合{VAR (\w+)}的字符都找出来,但当我把{VAR (\w+)}
写成{IF (\w+)=(\w+)}时就无法找出$read中所有符合{IF (\w+)=(\w+)}的字符了,显示
出错.

2.如果我想要取出变量中所有{IF (\w+)=(\w+)}到{END IF}之间的内容时我的写法是:
$read =~ /{IF (\w+)=(\w+)}(.*){END IF}/;
($tmp1,$tmp2,$readif) = ($1,$2,$3);
但$1,$2,$3中都没有值传递,很显然是上面那个语句有错误,但对比了多本书中的写法似乎
这种写法并没什么错误,实在不解.
各位前辈如果要取出$read中每一个{IF (\w+)=(\w+)}到{END IF}之间的内容一般会怎样写?

艰苦道路中探求前行,一切为了对Perl的崇拜与对程序设计的执着...
1. 循环有 while ($read =.
1. 循环有 while ($read =~ /{VAR (\w+)}/g)
另外你得看看后缀 s 的意思,IF END 之间一般还是要后缀 s 的

$read =~ /{IF (\w+)=(\w+)}(.*){END IF}/;
错是没错,就是 { 和 } 要改为 \{ \}
真是世外高人
前辈真是世外高人,前段时间安装FastCGI2.0时就是多得看了其中一分前辈写的文章
才得以顺利进行,今天又经点化竟然马上开窍,厉害,佩服.
其实就是要写后缀s.不过有点奇怪的是{ 和 } 不改为 \{ \} 也行.按理说{}是正则表达
式中默认的提取字符个数符号,当字符看待时应该要加入转义符\的,之所以不用写也行
大概是因为Perl自由的语法方式所造成的吧.
终于实现分支部分的解析功能了,接下来就到循环了,谢谢.