Как получить имя, соответствующее XS?

#c #perl #xs

Вопрос:

Поэтому я вызываю код C изнутри шаблона (используя (?{ и иногда (??{ ) из Perl.

В любом случае я хочу получить значения именованных захватов так же, как и при использовании $ {name} .

Возможно ли это?

Комментарии:

1. Вы можете использовать что-то вроде get_hv("%", 0) , но лучшим подходом может быть передача % в качестве аргумента.

Ответ №1:

Вот пример, где я передаю ссылку % на 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);
 

test.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>
 

Комментарии:

1. Будет ли это работать с повторяющимися именами?

2. Что вы подразумеваете под «дублирующими именами» ? Можете ли вы привести пример

3. Ну, это не проблема — это, вероятно, сработает — в настоящее время я просто передал значения именованных групп в качестве аргументов своей подпрограмме. Пример похож на тот, если у вас несколько count именованных групп,