首页 文章

如何将正则表达式作为参数传递给Perl 6中的子例程

提问于
浏览
4

可能我做的事情完全错了,但有没有办法修改和组合 regexes 使用子程序?下面的程序不会编译 .

sub a(Regex $r1) {
  return rx/ <$r1> a /
}

my regex letter_b { b };

my $new = a(letter_b);
say $new;

2 回答

  • 3

    查看Regex的文档,它说:

    可以使用正则表达式声明符定义命名的正则表达式,后跟花括号中的定义 . 由于任何正则表达式都可以进行Callable内省,因此需要通过&-sigil进行引用 . 我的正则表达式R {\ N};
    说&r . ^姓名; #OUTPUT:«Regex␤»

    此外,Grammar文档(对于概念,而不是类型),它解释了更多关于此:

    语法的主要成分是名为正则表达式 . 虽然Perl 6 Regexes的语法超出了本文档的范围,但是名为regexes的语法特殊,类似于子例程定义:my regex number {\ d [\ . \ d]? }
    在这种情况下,我们必须使用my关键字指定正则表达式的词法范围,因为命名的正则表达式通常在语法中使用 . 被命名给我们的优势是能够在其他地方轻松地重用正则表达式:比如说“32.51”~~&number; #OUTPUT:«True␤»
    这么说“15 4.5”~~ / <number> \ s *''\ s * <number> /#OUTPUT:«True␤»

    因此,要将您的命名正则表达式作为参数传递到 a 子例程中,您所要做的就是在其前面加上&符号:

    my $new = a(&letter_b);
    #           ^
    #  This is what you need!
    
    say $new;
    say so "ba" ~~ $new;         # OUTPUT: «True␤»
    say so "ca" ~~ $new;         # OUTPUT: «False␤»
    
  • 8

    要将函数称为第一个类值,请在其前面加上 & .

    另外,不需要写 <$r1> ,因为P6已经知道 $r1 是正则表达式 . 所以:

    sub a(Regex $r1) {
      return rx/ $r1 a /
    }
    
    my regex letter_b { b };
    
    my $new = a(&letter_b);
    say $new;                # rx/ $r1 a /
    say 'ba' ~~ $new;        # 「ba」
    

    你没有显示你的错误,但......

    a(letter_b) 调用 letter_b 来获取其值 . (然后 a 将被调用, letter_b 返回的值作为第一个参数传递给 a . )

    letter_b 是一个正则表达式,并且

    say Regex ~~ Method; # True
    

    并且所有方法至少需要一个调用arg:

    say &letter_b.signature; # (Mu $: *%_)
    

    但你用零参数调用它 . 产量:

    Too few positionals passed; expected 1 argument but got 0
    

    我猜这是你的错误信息 .

相关问题