曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3401|回复: 0
打印 上一主题 下一主题

given-when 控制结构

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-14 11:31:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
given-when 控制结构与 C 语言中的 switch..case 结构相仿。看下面代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

use 5.010;

given ($ARGV[0]) {
        when( /tom/i ) {say 'Name has tom in it'}
        when( /^tom/ ) {say 'Name starts with tom'}
        when( 'tom' )  {say 'Name is tom'}
        default        {say "I don't see tom"}
}


运行输出:
$ ./given.pl
I don't see tom
$ ./given.pl tomdkjaekda
Name has tom in it
在上面的测试输出中,第 2 次使用了 tomdkjaekda 参数来测试,但并没有看到 “Name starts with tom” 这句的输出,这是因为 given-when 默认添加了类似与 break 语句,也就是说,一旦某个条件匹配,那么就执行后面的语句块,然后退出。如果需要多次匹配,那么可以使用 continue,如下面改写过的程序:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

use 5.010;

given ($ARGV[0]) {
        when( /tom/i ) {say 'Name has tom in it';continue}
        when( /^tom/ ) {say 'Name starts with tom'}
        when( 'tom' )  {say 'Name is tom'}
        default        {say "I don't see tom"}
}

运行输出:
]$ ./given.pl tomdkjaekda
Name has tom in it
Name starts with tom
由于使用了 continue,那么在第一句的 when 匹配后,继续往下扫描。从这里看出,given-when 结构和 if-elsif-else 相似,但是后者只能一次性匹配后执行其后的程序块然后退出,而前者在加了 continue 后则可以继续扫描其下的内容。当然,也可以显式的使用 break 。

如果我们需要一次性进行多个匹配的比较,那么可以写成:
[code=perl]
foreach (@myarray) {         #不使用具名变量
   when (...) {...};
   when (...) {...};
   ...
   default;
}[/mw_shl_code]
有时可能还需要在 when 比较看一下 foreach 轮转到了哪个变量,那我们可以添加一条调试用的打印语句:
[code=perl]
foreach (@myarray) {         #不使用具名变量
   say "\nit is trun to $_";
   when (...) {...};
   when (...) {...};
   ...
   default;
}[/mw_shl_code]
在 when 块里面也可以插入语句:
[code=perl]
foreach (@myarray) {         #不使用具名变量
   when (...) {...};
   when (...) {...};
   ...
  say "hello perl world!\n";
  when (...) {...};
  when (...) {...};
   default;
}[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 05:47 , Processed in 0.066157 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表