前面介绍了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判断不通过,就判断elifelif可以有很多个如 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....dowhilewhile的区别是while的条件判断在开头,dowhile的条件判断在最后,也就是说do....dowhile无论如何都会至少执行一次循环体代码。

    流程控制结构差不多就上面这些,采集器用的比较多的是if结构和for结构。在上面的例子中涉及到一些内建模块函数比如bltRegexMatchFirst等这里没做介绍,放到后面的章节中。

    转载请注明来源 www.zengl.com ,OK ,
先到这里,休息,休息一下 O(∩_∩)O~

上下篇

下一篇: zengl脚本语法 第三章函数篇

上一篇: 智能采集器v1.0.3

相关文章

智能采集器v1.0.5

zengl脚本语法 第五章采集入门篇(二)

智能采集器v1.0.3

zengl脚本语法 第三章函数篇

zengl脚本语法 第六章内建函数枚举

zengl脚本语法 第七章内建函数枚举(二)