在 perl 中如何在不使用 XS 的情况下写入调用者的变量?

Posted

技术标签:

【中文标题】在 perl 中如何在不使用 XS 的情况下写入调用者的变量?【英文标题】:in perl how to write to caller's variable without using XS? 【发布时间】:2017-04-06 16:55:46 【问题描述】:

我正在围绕一些旧代码编写单元测试,并发现需要围绕 Apache2::Request 的 read() 方法编写一个模拟

my $r = Apache2::Request->new(...);

$r->read(my $buf, $len);

有没有办法在 Perl 中编写一个函数来填充$buf?我很确定这样做的唯一方法是使用带有 ** 的 XS 代码,但我想我至少要先问一下。

使用 Apache2::Request 直接导致了这一点,因此我希望模拟它。

perl: symbol lookup error: .../APR/Request/Apache2/Apache2.so: 
undefined symbol: modperl_xs_sv2request_rec

【问题讨论】:

所以你想模拟read,对吗? Perl 总是通过引用传递,所以你所要做的就是修改$_[1] 【参考方案1】:

在 Perl 子例程或方法中,参数通过 @_ 数组传递。此数组中的元素是调用子中的变量的别名

解压@_的常用方法是这样复制:

my($self, $buf, $len) = @_;

因此在这种情况下分配给$buf 将不起作用,因为您只修改了变量的副本。但是如果直接修改@_中的值,那么会影响调用者的变量:

$_[1] = 'some data';

【讨论】:

哈哈,我真的想不到自己在那里。谢谢!

以上是关于在 perl 中如何在不使用 XS 的情况下写入调用者的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道 sort(XS) 是如何实现的情况下调和这个问题

如何在不实际拆包的情况下获得 Perl 中打包项目的数量?

如何在不使用 Sybase/Perl 中的游标的情况下从表/文件中的 2 行中获取结果集中的一行

如何在不重新启动的情况下调试 mod_perl2 模块?

如何在不使用 JCL 中的 XSUM 的情况下从输入文件中删除重复项并将重复项写入文件? [关闭]

如何在不使用临时文件的情况下在 python 的 tarfile 中写入大量数据