在Test::Base 的 POD 中,有一个关于滚动我自己的过滤器的示例,文档称其为“自我解释”。我无法理解它,我认为这可能是我的过滤器写作中的一个问题。代码复制如下:
use Test::Base;
filters 'foo', 'bar=xyz';
sub foo {
transform(shift);
}
sub Test::Base::Filter::bar {
my $self = shift; # The Test::Base::Filter object
my $data = shift;
my $args = $self->current_arguments;
my $current_block_object = $self->block;
# transform $data in a barish manner
return $data;
}
该filters
函数将命名的子例程设置为传入数据的过滤器。声明的过滤器是“foo”和“bar”,它们有参数。
我的问题是为什么 foo 和 bar 的结构如此不同。为什么 foo 在当前命名空间中,而 bar 在 Test::Base::Filter 命名空间中声明?为什么 foo 改变了它的第一个参数,而 bar 必须从第二个参数中获取数据?
另一个例子。在 MyTest.pm 中:
package t::MyTest;
use Test::Base -Base;
#some stuff here
package t::MyTest::Filter;
use base 'Test::Base::Filter';
sub choose {
print @_;
return {foo => 'bar'} if($_[0] eq '1');
return undef;
}
sub is_defined{
print @_;
defined $_[0];
}
在 test.t 中:
use t::MyTest;
filters {input => [qw(choose is_defined)] };
__END__
=== First
--- input
1
--- expected: 1
=== Second
--- input
0
--- expected: 0
如果您将它们都放在“t”文件夹中并运行prove -v
,则输出如下:
t\01-test.t .. Use of uninitialized value $_[1] in print at t/MyTest.pm line 14,
<DATA> line 1.
1
t::MyTest::Filter=HASH(0x2af1670)ok 1 - First
1..1
Failed 1/1 subtests
Test Summary Report
-------------------
t\01-test.t (Wstat: 0 Tests: 0 Failed: 0)
Parse errors: Bad plan. You planned 1 tests but ran 0.
Files=1, Tests=0, 1 wallclock secs ( 0.06 usr + 0.23 sys = 0.30 CPU)
Result: FAIL
没关系警告(我不完全理解它的根源)。为什么第一个过滤器传递了输入(就像它应该是的那样),但第二个过滤器传递了一些过滤器对象?第二个过滤器的输入不应该是第一个过滤器的输出吗?如果不是,那么我不得不担心整个地方的过滤器排序。