perl6有色匹配,一些正则表达式插值有效,有些则没有;颜色代码不一致

我有一些长队,我想用我想要的颜色突出显示匹配.一个函数使用替换,另一个函数使用递归.有些是作品,有些则没有;我正在寻找一种插入到正则表达式的一致方法.非常感谢你 !!!

sub colorMatch ($aStr,$aRegex,$aColor) {
    my $colorOff = '\e[0m';
    my $a =$aStr.subst(/(<{$aRegex}>)/,$aColor ~ "# $/ #" ~ $colorOff,:g);
    # not working,$/ not interpolating corresponding matches,all Nil
    say $a;
}

colorMatch("a-12-b-3-c-4-def-567",'\d+','\e[1;31m');
colorMatch("a-12-b-3-c-4-def-567",'<alpha>+','\e[1;31m');
say "\e[1;31m" ~ " color1 " ~ "\e[0m" ~ 
    "\e[1;36m" ~ " color2 " ~ "\e[0m";

sub colorMatch2 ($aStr,$colorNumber) {
    my $colorOff = "\e[0m";
    if $aStr.chars > 0 {
    my $x1 = ($aStr ~~ m/<{$aRegex}>/);
    my $x2 = $x1.prematch;
    my $x3 = $x1.Str;
    my $x4 = $x1.postmatch;
    return ($x2 ~ "\e[1;{$colorNumber}m" ~ $x3 ~ $colorOff)
        ~ colorMatch2($x4,$colorNumber);
    }
}

say colorMatch2("a-12-b-3-c-4-def-567",31); # works,red color
say colorMatch2("a-12-b-3-c-4-def-567",'567',36); # works,green color
say colorMatch2("a-12-b-3-c-4-def-567",'\w+','[a..z]+',31); # fails with [] and ..
say colorMatch2("a-12-b-3-c-4-def-567","<alpha>+",31); # fails with <>


Use of Nil in string context
  in sub colorMatch at colorMatch.pl line 4
a-\e[1;31m#  #\e[0m-b-\e[1;31m#  #\e[0m-c-\e[1;31m#  #\e[0m-def-\e[1;31m#  #\e[0m

# seems to do substitution,but $/ is empty and color not shown;

Use of Nil in string context
  in sub colorMatch at colorMatch.pl line 4
\e[1;31m#  #\e[0m-12-\e[1;31m#  #\e[0m-3-\e[1;31m#  #\e[0m-4-\e[1;31m#  #\e[0m-567

# seems to do substitution,but $/ is empty and color not shown;

 color1  color2 # both colors work and shown as expected,# color1 red and color 2 green; why inconsistent with above???

a-12-b-3-c-4-def-567 # works,red color
a-12-b-3-c-4-def-567 # works,green color
a-12-b-3-c-4-def-567 # works,red color
No such method 'prematch' for invocant of type 'Bool'
  in sub colorMatch2 at colorMatch.pl line 17
  in block <unit> at colorMatch.pl line 28

解决方法

这不是插值问题.字符类和范围的语法略有不同.你需要:

'text' ~~ / <[a..z]>+ /

至于你在bool上调用prematch()的其他错误,结果是False,因为在最终的递归级别,它不再匹配.在假设匹配之前,您需要检查结果.

最后,对于“在字符串上下文中使用Nil”,这是因为您使用的是Str.subst,并且与大多数语言中的大多数函数调用一样,在函数开始之前会对参数进行求值.你在参数中使用$/,但它还没有设置,因为函数的主体甚至没有开始执行. s / match / replacement /运算符不会遇到这种困难,所以我建议你将代码更改为:

$aStr ~~ s:g/(<$aRegex>)/$aColor# $/ #$colorOff/;

(或者为了更好的可读性:)

$aStr ~~ s:g {(<$aRegex>)} = "$aColor# $/ #$colorOff";

这假设您已将$aRegex变为正则表达式而不是字符串.此外,由于新代码修改了$aStr,您需要将$aStr更改为$aStr是函数签名中的副本.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...