#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
именованных групп,