Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PerlXS代码中的绑定文件句柄?_Perl_Io_Xs - Fatal编程技术网

如何使用PerlXS代码中的绑定文件句柄?

如何使用PerlXS代码中的绑定文件句柄?,perl,io,xs,Perl,Io,Xs,下面的最小示例定义了PerlIO_write的包装器: MODULE = My::FH PACKAGE = My::FH INCLUDE: const-xs.inc int write_fh (SV* fh, SV* str) CODE: STRLEN len char* buf = SvPV(str, len); PerlIO* io = IoIFP(sv_2io(fh)); if (io) { RETVAL = PerlIO_write(io, buf, len); }

下面的最小示例定义了
PerlIO_write
的包装器:

MODULE = My::FH        PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
CODE:
STRLEN len
char* buf = SvPV(str, len);
PerlIO* io = IoIFP(sv_2io(fh));
if (io) {
    RETVAL = PerlIO_write(io, buf, len);
} else {
    croak("cannot use fh as a PerlIO handle");
}
OUTPUT:
RETVAL
在已创建的文件句柄上使用
write\u fh
函数
使用
open$fh,
print

io && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
这是真的。要放在堆栈上的祝福对象是

SvTIED_obj(MUTABLE_SV(io), mg)

顺便说一下,XS编译器可以将非声明代码放在
code
的内容之前,因此
code
的内容不能以声明开头

CODE:
    STRLEN len
    char* buf = SvPV(str, len);
    PerlIO* io = IoIFP(sv_2io(fh));
    if (io) {
    ...
应该是

CODE:
    {
        STRLEN len
        char* buf = SvPV(str, len);
        PerlIO* io = IoIFP(sv_2io(fh));
        if (io) {
        ...
    }


print
使用
call\u方法

io && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
这是真的。要放在堆栈上的祝福对象是

SvTIED_obj(MUTABLE_SV(io), mg)

顺便说一下,XS编译器可以将非声明代码放在
code
的内容之前,因此
code
的内容不能以声明开头

CODE:
    STRLEN len
    char* buf = SvPV(str, len);
    PerlIO* io = IoIFP(sv_2io(fh));
    if (io) {
    ...
应该是

CODE:
    {
        STRLEN len
        char* buf = SvPV(str, len);
        PerlIO* io = IoIFP(sv_2io(fh));
        if (io) {
        ...
    }


在尝试理解
pp_hot.c
在阅读《perlcall(3)
》一文时,我想到了以下几点: 代码。这有意义吗

MODULE = My::FH        PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
INIT:
STRLEN len;
char* buf = SvPV(str, len);
PerlIO* pio = IoIFP(sv_2io(fh));
CODE:
if (pio) {
  RETVAL = PerlIO_write(pio, buf, len);
} else {
  if (!SvROK(fh))
    croak("fh is not a reference");
  IO* io = GvIO(SvRV(fh));
  if (io == NULL)
    croak("fh is not a GLOB reference");
  MAGIC* mg = SvTIED_mg((const SV*)io, PERL_MAGIC_tiedscalar);
  if (mg == NULL)
    croak("fh is not a tied filehandle");
  SV* obj = SvTIED_obj(MUTABLE_SV(io), mg);
  if (obj == NULL) 
    croak("???");
  ENTER;
  SAVETMPS;
  PUSHMARK(SP);
  XPUSHs(obj);
  XPUSHs(str);
  PUTBACK;
  RETVAL = call_method("PRINT", G_SCALAR);
  if (i != 1)
    croak("wrong number of return values (%i)", RETVAL);
  SPAGAIN;
  RETVAL=POPi;
  PUTBACK;
  FREETEMPS;
  LEAVE;
}
OUTPUT:
RETVAL

在尝试理解
pp_hot.c
在阅读《perlcall(3)》一文时,我想到了以下几点: 代码。这有意义吗

MODULE = My::FH        PACKAGE = My::FH
INCLUDE: const-xs.inc
int
write_fh (SV* fh, SV* str)
INIT:
STRLEN len;
char* buf = SvPV(str, len);
PerlIO* pio = IoIFP(sv_2io(fh));
CODE:
if (pio) {
  RETVAL = PerlIO_write(pio, buf, len);
} else {
  if (!SvROK(fh))
    croak("fh is not a reference");
  IO* io = GvIO(SvRV(fh));
  if (io == NULL)
    croak("fh is not a GLOB reference");
  MAGIC* mg = SvTIED_mg((const SV*)io, PERL_MAGIC_tiedscalar);
  if (mg == NULL)
    croak("fh is not a tied filehandle");
  SV* obj = SvTIED_obj(MUTABLE_SV(io), mg);
  if (obj == NULL) 
    croak("???");
  ENTER;
  SAVETMPS;
  PUSHMARK(SP);
  XPUSHs(obj);
  XPUSHs(str);
  PUTBACK;
  RETVAL = call_method("PRINT", G_SCALAR);
  if (i != 1)
    croak("wrong number of return values (%i)", RETVAL);
  SPAGAIN;
  RETVAL=POPi;
  PUTBACK;
  FREETEMPS;
  LEAVE;
}
OUTPUT:
RETVAL

哎呀,到处都是特例。。。我将尝试一下,谢谢。一些测试代码显示,绑定文件句柄的
svrmogic
为0,因此使用
SvTIED_mg()
不起作用……我尝试了5个不同版本的Perl,从5.10.1到5.16.1,
io
总是
svrmogic
。代码:perl-MTie::Handle-MDevel::Peek-wE“tie*FH,'tie::StdHandle';Dump*FH{IO}”您也可以调用一个perl子函数,它对XS代码进行打印。。。我将尝试一下,谢谢。一些测试代码显示,绑定文件句柄的
svrmogic
为0,因此使用
SvTIED_mg()
不起作用……我尝试了5个不同版本的Perl,从5.10.1到5.16.1,
io
总是
svrmogic
。代码:perl-MTie::Handle-MDevel::Peek-wE“tie*FH,'tie::StdHandle';Dump*FH{IO}”您也可以调用一个perl子函数,它对XS代码执行打印。