SVs_RMG
フラグ (テストSvRMAGICAL
および設定/クリアするもの) は、変数に、魔法の getter メソッド (フラグで示される) と魔法の setter メソッド ( で示される)SvRMAGICAL_on/SvRMAGICAL_off
以外の何らかの魔法が関連付けられていることを意味します。SVs_GMG
SVs_SMG
ここでは詳しく説明しませんが、RMAGIC
がオンになっている変数の例には、ほとんどの値%ENV
(プログラムの開始時に設定されるものであり、実行時に定義するものではありません) 、%!
およびの値が含まれます。 %SIG
、および名前付きサブルーチンの stash 値 (つまり、プログラム内)
package main;
sub foo { 42 }
$::{"foo"}
RMAGICAL であり、そうで$::{"bar"}
はない)。使用Devel::Peek
することは少しですが、この魔法が何であるかについて完全に啓発するわけではありません:
$ /usr/bin/perl -MDevel::Peek -e 'Dump $ENV{HOSTNAME}'
SV = PVMG(0x8003e910) at 0x800715f0
REFCNT = 1
FLAGS = (SMG,RMG,POK,pPOK)
IV = 0
NV = 0
PV = 0x80072790 "localhost"\0
CUR = 10
LEN = 12
MAGIC = 0x800727a0
MG_VIRTUAL = &PL_vtbl_envelem
MG_TYPE = PERL_MAGIC_envelem(e)
MG_LEN = 8
MG_PTR = 0x800727c0 "HOSTNAME"
ここで、保持され$ENV{HOSTNAME}
ているスカラーにMG_TYPE
andMG_VIRTUAL
があることがわかります。これは、この変数の魔法の方法と理由ではなく、何を提供するかを示します。「通常の」魔法の変数では、これらは通常 (常に?)PERL_MAGIC_sv
と&PL_vtbl_sv
:
$ /usr/bin/perl -MDevel::Peek -e 'Dump $='
SV = PVMG(0x8008e080) at 0x80071de8
REFCNT = 1
FLAGS = (GMG,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x80085aa8
MG_VIRTUAL = &PL_vtbl_sv
MG_TYPE = PERL_MAGIC_sv(\0)
MG_OBJ = 0x80071d58
MG_LEN = 1
MG_PTR = 0x80081ad0 "="
SvRMAGICAL_off
が使用されている perl ソース内の 1 つの場所がありperlio.c
ますXS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
。
XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
{
dXSARGS;
SV * const sv = SvRV(ST(1));
AV * const av = newAV();
MAGIC *mg;
int count = 0;
int i;
sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);
SvRMAGICAL_off(sv);
mg = mg_find(sv, PERL_MAGIC_ext);
mg->mg_virtual = &perlio_vtab;
mg_magical(sv);
Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
for (i = 2; i < items; i++) {
STRLEN len;
const char * const name = SvPV_const(ST(i), len);
SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
if (layer) {
av_push(av, SvREFCNT_inc_simple_NN(layer));
}
else {
ST(count) = ST(i);
count++;
}
}
SvREFCNT_dec(av);
XSRETURN(count);
}
なんらかの理由で (繰り返しますが、私は理解できません)、彼らはmg_find
通話中にその魔法をオフにしたいと考えています。