获取$@,$<,$^X的方式稍有不同:
GV *gv;
gv = gv_fetchpv("@", TRUE, SVt_PV);
gv = gv_fetchpv("<", TRUE, SVt_PV);
if(gv){
printf("$< is:\t%ld\n", SvIV(GvSV(gv)));
}
/*^X, CTRL-X*/
gv = gv_fetchpv("\030", 0, SVt_PV);
if(gv){
printf("$^X = %s\n", SvPV(GvSV(gv), n_a));
}
关于gv_fetchpv(perl-5.14.1):
#define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c)
GV *
Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, const svtype sv_type) {
PERL_ARGS_ASSERT_GV_FETCHPV;
return gv_fetchpvn_flags(nambeg, strlen(nambeg), add, sv_type);
}
关于$^X:
STATIC void
S_set_caret_X(pTHX) {
dVAR;
GV* tmpgv = gv_fetchpvs("\030", GV_ADD|GV_NOTQUAL, SVt_PV); /* $^X */
if (tmpgv) {
#ifdef HAS_PROCSELFEXE
S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
#else
#ifdef OS2
sv_setpv(GvSVn(tmpgv), os2_execname(aTHX));
#else
sv_setpv(GvSVn(tmpgv),PL_origargv[0]);
#endif
#endif
}
}
所以char *embedding[] = { "", "-e", "0" };的第一个元素只是提供一个选项,
$^X的最终取值在不同平台也会不同。
参考:
$^X
Getting Special Variable Values(部分信息已过时)