Я пытаюсь установить переменную среды Perl из XSUB. Я хочу, чтобы это вступило в силу немедленно до выхода XSUB. Вот мой файл XS, Module.xs
:
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
MODULE = My::Module PACKAGE = My::Module
PROTOTYPES: DISABLE
void
set_env_test()
CODE:
I32 croak_on_error = 1;
eval_pv("$ENV{PERL_MEM_LOG}='ms'", croak_on_error);
printf("C1: getenv : %s\n", getenv("PERL_MEM_LOG"));
printf("C1: PerlEnv_getenv : %s\n", PerlEnv_getenv("PERL_MEM_LOG"));
my_setenv("PERL_MEM_LOG", "s");
printf("C2: getenv : %s\n", getenv("PERL_MEM_LOG"));
printf("C2: PerlEnv_getenv : %s\n", PerlEnv_getenv("PERL_MEM_LOG"));
а вот Perl-скрипт, использующий XSUB:
use feature qw(say);
use strict;
use warnings;
use ExtUtils::testlib;
use My::Module;
{
say "Before: ", get_env();
My::Module::set_env_test();
say "After: ", get_env();
}
sub get_env {
if (exists $ENV{PERL_MEM_LOG}) {
return $ENV{PERL_MEM_LOG};
}
else {
return "undef";
}
}
Результат:
Before: undef
C1: getenv : ms
C1: PerlEnv_getenv : ms
C2: getenv : s
C2: PerlEnv_getenv : s
After: ms
Я хотел бы знать, можно ли установить переменную среды без использования eval_pv()
? Есть ли конкретная функция API, которую я могу использовать?
Наблюдения:
eval_pv()
работает как положено,my_setenv()
работает локально и заменяет значение, установленноеeval_pv()
, до выхода из XSUB, после чего восстанавливается старое значение.my_setenv()
нельзя использовать для постоянной установки переменной среды Perl, ее действие длится только внутри XSUB.getenv()
иPerlEnv_getenv()
, похоже, делают одно и то же (?)