在 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) 是如何实现的情况下调和这个问题
如何在不使用 Sybase/Perl 中的游标的情况下从表/文件中的 2 行中获取结果集中的一行