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] |