【问题标题】:in perl how to write to caller's variable without using XS?在 perl 中如何在不使用 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]

标签: perl mocking mod-perl2


【解决方案1】:

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

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

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

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

$_[1] = 'some data';

【讨论】:

  • 哈哈,我真的想不到自己在那里。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多