代码之家  ›  专栏  ›  技术社区  ›  AnArrayOfFunctions

如何获得命名匹配XS?

  •  0
  • AnArrayOfFunctions  · 技术社区  · 3 年前

    所以我从中间模式内部调用C代码(使用 (?{ 有时 (??{ )来自Perl。

    无论如何,我想以与使用相同的方式获得命名捕获的值 $+{name} .

    这可能吗?

    0 回复  |  直到 3 年前
        1
  •  2
  •   Håkon Hægland    3 年前

    以下是一个示例,其中我将引用传递给 %+ 到XSUB:

    Rx.xs :

    #define PERL_NO_GET_CONTEXT
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"
    
    SV *get_hash_sv(HV *hash, const char *key) {
        SV * key_sv = newSVpv (key, strlen (key));
        int value;
        if (hv_exists_ent (hash, key_sv, 0)) {
            HE *he = hv_fetch_ent (hash, key_sv, 0, 0);
            return HeVAL (he);
        }
        else {
            croak("The hash key for '%s' doesn't exist", key);
        }
    }
    
    MODULE = My::Rx  PACKAGE = My::Rx
    PROTOTYPES: DISABLE
    
    void
    foo(hash)
        HV *hash
        CODE:
             SV *sv = get_hash_sv(hash, "count");
             STRLEN len;
             char *str = SvPV(sv, len);
             printf("<%.*s>\n", len, str);
    

    测试.pl

    use feature qw(say);
    use strict;
    use warnings;
    use ExtUtils::testlib;
    use My::Rx;
    my $str = "a 34 b 54";
    my @res = $str =~ /(?<count>\d+)(?{My::Rx::foo(\%+)})/g;
    

    输出 :

    <34>
    <54>