Perl笔记:Perl语言入门(第六版) - 智能匹配、given-when

来源:互联网 发布:mysql offset查询优化 编辑:程序博客网 时间:2024/03/28 19:44

智能匹配

智能匹配操作符~~

use 5.010001; #至少是5.10.1版

会根据两边的操作数的数据类型自动判断该用何种方式进行比较或匹配。

查找匹配的哈希键

use 5.010001;

say "I found a key matching 'Fred'" if %names ~~ /Fred/;

对于哈希和正则表达式,智能匹配遍历哈希所有键,用给定的正则表达式逐个测试,找到匹配的键,就返回真。

比较两个数组

say "The arrays have the same elements!" if @names1 ~~ @names2;

检查标量是否在数组中

say "yes" if $value ~~ @nums;

智能匹配对两边的操作数的顺序一般没有要求[ if @nums ~~ $value ]。

智能匹配操作的优先级

%a ~~ %b 哈希的键是否一致

%a ~~ @b 哈希至少一个键在列表中

%a ~~ /Fred/ 至少一个键匹配给定模式

'Fred' ~~ %a 是否存在$a{Fred}

@a ~~ @b 数组是否相同

@a ~~ /Fred/ 数组中至少一个元素匹配模式

$name ~~ undef $name $name没有定义

$name ~~ /Fred/ 模式匹配

123 ~~ '123.0' 数值和“numish”类型的字符串是否相等

'Fred' ~~ 'Fred' 字符串是否相同

123 ~~ 456 数值是否相等

不满足匹配项顺序无关的例子

say "match number ~~ string" if 4 ~~ '4abc';

say "match string ~~ number" if '4abc' ~~ 4;

输出:match string ~~ number。

given语句

given-when控制结构类似C语音的switch。

use 5.010001;

given ( $ARGV[0] ) {

when ( 'Fred' ) { say 'Name is Fred' }

when ( /fred/i ) {say 'Name has fred in it'}

when ( /\AFred/ ) {say 'Name starts with Fred'}

default {say "I don't see a Fred"}

}

given会将参数化名为$_,每个when都尝试智能匹配$_。

可以在when语句块末尾使用continue,Perl会尝试执行下一条的when语句,在条件满足时执行对于语句块。

笨拙匹配

given-when语句中也可以使用普通的比较或匹配,也可以和智能匹配混用。

否定的表达式,包括否定的正则表达式,都不会使用智能匹配。

多个条目的when匹配

when可以和foreach配合使用

foreach ( @names ) { #不要使用具名控制变量

say "\nProcessing $_";


when ( /fred/i ) {say 'Name has fred in it'; continue}

when ( /\AFred/ ) {say 'Name starts with Fred'; continue}

when ( 'Fred' ) { say 'Name is Fred'; }

say "Moving on to default...";

default {say "I don't see a Fred"}

}

0 0