前面介绍了zengl脚本的基本语法,这节介绍下脚本中的流程控制语句,如if-elif-endif条件选择,for...endfor循环结构等。 同样的,将Module目录中的供应模块规则.zl做...
前面介绍了zengl脚本的基本语法,这节介绍下脚本中的流程控制语句,如if-elif-endif条件选择,for...endfor循环结构等。
同样的,将Module目录中的供应模块规则.zl做个备份,然后新建一个供应模块规则.zl,其中输入如下代码:
use builtin; //加载内建模块,这样下面的blt开头的函数才能使用
remote_content = bltCurlGetUrl('www.baidu.com'); //通过bltCurlGetUrl函数来抓取百度首页的内容,并赋值给remote_content变量
bltInfoBox(remote_content); //通过bltInfoBox函数弹出一个信息对话框,并显示抓取下来的内容。
if(bltRegexMatchFirst('<title>(.*?)</title>',1,remote_content,&title,0) >=0) //通过bltRegexMatchFirst和正则表达式将标题抓取到变量title中
bltInfoBox('标题是:'+title); //通过信息对话框显示标题。
else
bltInfoBox('正则表达式捕获标题失败!');
endif
上面注释里的解释都比较清楚,这里之所以用bltInfoBox而不用print,是因为print指令是将要显示的内容输出到程序的日志面板中,当内容 一多时,就会很卡(因为日志面板是富文本框,可以显示颜色的,比普通的纯文本框开销要大),所以使用bltInfoBox来弹出一个信息对话框,信息对话 框就很适合显示数据量大的内容,如下所示:
if....else....endif条件选择结构的意思就是当if右边括号里的表达式为真时(在本例中就是当bltRegexMatchFirst函数结果大于等于0时),就执行if下面的语句(本例中就是显示捕获的标题信息),否则就执行else下面的语句(本例中就是显示出错信息)。本例执行完if语句后,通常就会打印如下信息(之所以通常是因为标题的正则表达式规则一般不怎么变动):
另外还可以是更多层次的复杂的条件选择,如:
a=5;
if(a<5)
print 'a 小于 5';
elif(a>5)
print 'a 大于 5';
else
print 'a 等于 5';
endif
通过if....elif.....else.....endif实现多重条件选择,if判断不通过,就判断elif,elif可以有很多个如 if ...... elif ..... elif .... elif ..... else ....endif ,最后都不通过就执行else后面的语句。
if里面还可以嵌套if,如:
a = -3;
if(a<5)
if(a > 0)
print 'a 小于 5 但大于0';
else
print 'a 小于或等于 0';
endif
elif(a>5)
print 'a 大于 5';
else
print 'a 等于 5';
endif
下面看下循环结构:
keywords = array(); //初始化数组keywords
mustwords = array(); //初始化数组mustwords
keywords_count = bltGetKeyWords(keywords,mustwords); //使用bltGetKeyWords内建模块函数获取关键词信息存放到keywords数组中,每个关键词对应的必须包含的词存放到mustwords数组中。返回的结果为关键词的个数。
for(i=0;i<keywords_count;i++)
print '关键词'+i+':'+keywords[i] + '\n必需包含词:'+
mustwords[i];
endfor
上面的array函数用来初始化数组(为其分配一些虚拟机内存),再将分配的数组赋值给变量。bltGetKeyWords可以将所有该分类的关键词存放到第一个参数数组中,将必须包含的词填入到第二个参数数组中。
for右侧括号里的第一个部分是初始化数据区,如本例,将i变量初始化为0(i将作为索引用来索引数组中的元素),第二个部分为条件判断,当i小于 keywords_count关键词总数时就会执行循环体里的代码,第三个部分是当循环体执行完时,自动执行的代码,如本例打印完信息后就会自动对变量i 加一,然后继续下一次的打印,直到i大于keywords_count为止。显示结果如下:
上图打印出了勾选分类中的所有关键词信息。
下面再看下switch....case....default....endswt多条件分支选择:
a = 5;
switch(a)
case 1:
print '你是1号';
break; //必须要有break没有break就会执行case 2部分的代码了。和C语言一样
case 2:
print '你是2号';
break;
case 3:
print '你是3号';
break;
default:
print '你是闲杂人员';
break;
endswt
switch....case结构是指通过判断switch括号中的值,选择执行不同的代码,与if...else...endif很相似,switch...case结构效率高些,不过switch....case只能判断整数(如果是字符串或浮点数也会转为整数再进行判断,因为只有整数才能达到高效率),一般用在游戏开发中,在采集器规则中暂时没用到。
本例打印结果如下:
再来看下while.....endwhile循环结构:
keywords = array();
mustwords = array();
keywords_count = bltGetKeyWords(keywords,mustwords);
i=0;
while(i<keywords_count) //使用while进行循环
print '关键词('+i+'):'+keywords[i] + '\n必需包含词:'+
mustwords[i];
i++;
endwhile
while和for循环的区别在于:while循环结构在括号里只有条件判断,没有初始化和后续处理部分。结构比for简洁些,不过本质都一样。
最后看下do....dowhile循环结构:
keywords = array();
mustwords = array();
keywords_count = bltGetKeyWords(keywords,mustwords);
i=0;
do
print '关键词['+i+']:'+keywords[i] + '\n必需包含词:'+
mustwords[i];
i++;
dowhile(i<keywords_count)
do....dowhile和while的区别是while的条件判断在开头,dowhile的条件判断在最后,也就是说do....dowhile无论如何都会至少执行一次循环体代码。
流程控制结构差不多就上面这些,采集器用的比较多的是if结构和for结构。在上面的例子中涉及到一些内建模块函数比如bltRegexMatchFirst等这里没做介绍,放到后面的章节中。
转载请注明来源 www.zengl.com ,OK ,先到这里,休息,休息一下 O(∩_∩)O~