曲径通幽论坛

标题: given-when 控制结构 [打印本页]

作者: beyes    时间: 2011-10-14 11:31
标题: given-when 控制结构
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]




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2