如何修正Perl代码实现删除句子除首字母外的所有元音?
代码存在的问题
- 类型用法错误:你声明的
$x是Perl标量(存储字符串),但@x[1..]是数组切片写法,根本不能用来操作字符串字符,同时Perl原生不支持[1..]这种省略结束下标的切片语法。 - 逻辑完全错误:就算你能遍历到字符串从第二位开始的字符,循环内的
tr操作是直接删除整个$x里的所有元音,首字符如果是元音也会被误删,完全不符合需求。 - tr语法错误:
tr/A E I O U a e i o u//d里的空格会被识别为要删除的字符,会把句子里的空格也删掉,偏离需求。
修正方法
跳过首字母最直接的两种实现方式:
方法1:拆分字符串单独处理剩余部分
把字符串拆成首字符和剩余片段,只对剩余片段做元音删除后再拼接:
$x = "without any vowels after the first letter\n"; # 提取首字符 $first = substr($x, 0, 1); # 提取从第二位开始的剩余内容 $remain = substr($x, 1); # 删除剩余内容里的所有元音,tr不要加多余空格 $remain =~ tr/AEIOUaeiou//d; # 拼接得到最终结果 $x = $first . $remain; print $x;
方法2:正则后顾断言一行实现
用负向后顾断言匹配非开头位置的元音,直接全局删除:
$x = "without any vowels after the first letter\n"; # (?<!^) 表示当前位置不是字符串开头,只匹配首字符之后的元音 $x =~ s/(?<!^)[AEIOUaeiou]//g; print $x;
内容的提问来源于stack exchange,提问作者Traveller
相关产品推荐
相关产品推荐

