正则表达式与Perl子程序实战

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 子例程的子例程,旨在检查字符串是否包含任何小写字母,但至少部分是错误的。手动分析每个子例程,判断其是否正确,并描述其实际功能(假设参数是字符串)。然后用不同输入字符串测试,检查分析是否正确。注意:以下部分子例程有误。

各子例程分析如下:

  1. any_lowercase1 :仅检查参数的第一个字符,检查后退出循环。
  2. any_lowercase2 :调用 is-lower 子例程时,传入的是字符串 "char" 而非 $char 变量,且和 any_lowercase1 有相同缺陷。
  3. any_lowercase3 :仅根据输入字符串的最后一个字符返回 True False
  4. any_lowercase4 :存在运算符优先级问题,赋值操作先于 or 运算符执行,可改为 $flag = $flag || is-lower $char $flag = ($flag or is-lower $char) 解决。
  5. any_lowercase5 :正确,遍历字符串,若有小写字母则将标志设为 True 并最终返回。
  6. any_lowercase6 :算法基本正确,但返回的是字符串 "True" "False" 而非布尔值。
  7. any_lowercase7 :正确,遍历字符串,若有小写字母则返回 True ,否则返回 False
  8. any_lo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值