25、编写一个正则表达式来匹配并捕获以小写元音字母开头的字符串中的第一个单词。
可以使用正则表达式 /<[aeiouy]\w*/ 来匹配以小写元音字母开头的第一个单词。示例代码如下:
my $string = "Democracy is the worst form of government, " . "except for all the others. (Churchill)";
say ~$0 if $string ~~ /<[aeiouy]\w*/;
这里使用 * 量词是因为只包含一个元音字母的单词也符合以元音字母开头的单词的条件。
26、编写一些正则表达式来匹配并捕获法国手机号码(在法国,手机号码有10位数字,以“06”或“07”开头);假设数字是连续的(无空格)。
可以使用如下正则表达式: /(0[67]\d{8})/
解释:
- 0[67] 匹配以“06”或者“07”开头
- \d{8} 匹配后续的8个数字
- 括号用于捕获匹配到的手机号码
示例代码如下:
my $string = "0612345678 0787654321 1234567890";
say ~$0 if $string ~~ /(0[67]\d{8})/;
27、编写一些正则表达式来匹配并捕获:首次出现的重复字母(连续两个相同的字母)
可以使用正则表达式 /(.)\1/ 来匹配首次出现的重复字母,其中:
- 括号
()捕获一个任意字符 -
\1表示对第一个捕获组的反向引用,确保与前面捕获的字符相同
28、编写一个子程序,使用 index 函数在循环中计算 ‘banana’ 中字符 ‘a’ 的数量。修改该子程序,使其能够计算传递给子程序的任意单词中任意字母的数量。再编写另一个子程序,使用 substr 函数来计算给定单词中给定字母的数量。
使用 index 函数计算任意单词中任意字母数量的子程序:
sub count_index (Str $word, Str $letter) {
my $count = 0;
my $idx = 0;
while True {
$idx = index $word, $letter, $idx;
last unless $idx.defined;
$idx++;
$count++;
}
return $count;
}
使用 substr 函数计算给定单词中给定字母数量的子程序:
sub count_substr (Str $word, Str $letter) {
my $count = 0;
for 0..$word.chars - 1 {
$count++ if $letter eq substr $word, $_, 1;
}
return $count;
}
29、<[a..z]字符类可匹配任何小写字符(仅普通 ASCII 小写字符,非 Unicode 字符)。以下子例程 sub is - lower (Str $input) { return so $char ~~ /^<[a..z]>$/ } 若其参数是 ASCII 小写字母则应返回 True,否则返回 False。测试它是否按预期工作(如有需要进行修正)。so 函数将正则匹配结果转换为布尔值。以下有多个使用了 is - lower 子例程的子例程,旨在检查字符串是否包含任何小写字母,但至少部分是错误的。手动分析每个子例程,判断其是否正确,并描述其实际功能(假设参数是字符串)。然后用不同输入字符串测试,检查分析是否正确。注意:以下部分子例程有误。
各子例程分析如下:
-
any_lowercase1:仅检查参数的第一个字符,检查后退出循环。 -
any_lowercase2:调用is-lower子例程时,传入的是字符串"char"而非$char变量,且和any_lowercase1有相同缺陷。 -
any_lowercase3:仅根据输入字符串的最后一个字符返回True或False。 -
any_lowercase4:存在运算符优先级问题,赋值操作先于or运算符执行,可改为$flag = $flag || is-lower $char或$flag = ($flag or is-lower $char)解决。 -
any_lowercase5:正确,遍历字符串,若有小写字母则将标志设为True并最终返回。 -
any_lowercase6:算法基本正确,但返回的是字符串"True"或"False"而非布尔值。 -
any_lowercase7:正确,遍历字符串,若有小写字母则返回True,否则返回False。 -
any_lo

最低0.47元/天 解锁文章
718

被折叠的 条评论
为什么被折叠?



