Perl智能匹配与given-when结构

智能匹配操作符

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

say "I found Fred in the name!" if $name ~~ /Fred/;
say "I found a key matching 'Fred'" if %name ~~ /Fred/;
say "The arrays have the same elements!" if @names1 ~~ @names2;
say "The number is one of the elements of the array!" if @names ~~ $number;
say "at least one element of the array is the key of hash!" if @names ~~ %hash;
  • 当智能匹配操作符看见一个哈希,一个正则表达式,它知道要遍历%names的所有键,用给定的正则表达式逐个测试。
  • 当智能匹配操作符看见两个数组,它会比较两个数组的元素是否完全相同。
  • 当智能匹配操作符看见1个数组,一个数字,它会比较数字是否出现在数组里。
  • 当智能匹配操作符看见1个数组,一个hash,它会要求数组中至少有一个元素是hash的键。 操作数的顺序不会对表达式结果产生影响。

given—when语句

given-when可以看成是Larry为了模仿switch语句的产物,但是更具perl色彩。

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 do not see a fred"}
}

given-when会将参数化名为$_。given-when语句常常能改写成if-elsif-else语句,但是某些情况下,也不尽然。在每个when语句块后面都好像有一句break,它告诉perl现在就跳出given-when结构,如果我们需要接着匹配剩下的条件,那么需要显式的加上continue语句:

given(@ARGV[0]){
    when('Fred'){say "name is Fred" continue}
    when(/Fred/i){say "name has fred in it" continue}
    when(/\AFred){say "name starts with Fred"   }
    default      {say "I do not see a fred"}
}

注意最后一个when语句块一定不能加continue,否则default语句肯定会执行。

多个条目的when匹配

可以省略given,让foreach将当前正在遍历的元素放入自己的$_里。

foreach(@names){
    when('Fred'){say "name is Fred" continue}
    when(/Fred/i){say "name has fred in it" continue}
    when(/\AFred){say "name starts with Fred"   }
    default      {say "I do not see a fred"}
    }

Comments !