2

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

没关系警告(我不完全理解它的根源)。为什么第一个过滤器传递了输入(就像它应该是的那样),但第二个过滤器传递了一些过滤器对象?第二个过滤器的输入不应该是第一个过滤器的输出吗?如果不是,那么我不得不担心整个地方的过滤器排序。

4

1 回答 1

0

我想通了。我很确定这是过滤器工作方式中的一个错误。POD 说:

Each filter can take either a scalar or a list as input, and will return either a scalar or a list. Since filters are chained together, it is important to learn which filters expect which kind of input and return which kind of output.

Perldoc 告诉我这undef是 Perl 中的有效标量,但 Test::Base::Filter 忽略它。通常,过滤器的输入首先是数据,然后是其他一些东西。但是,如果一个过滤器返回 undef,那么它的返回值将被忽略,并且下一个过滤器会少一个参数,而不是undef作为它的第一个参数。我将在 RT 中归档。

于 2012-09-22T21:18:26.760 回答