2012-09-21 77 views
2

POD for Test::Base中,有一個關於滾動我自己的過濾器的例子,文檔中說這個過濾器是「自我解釋的」。我無法理解它,我認爲這可能是我的過濾器寫作中的一個問題。該代碼是轉載如下:Test :: Base :: Filter arguments

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 

沒關係警告(我不完全瞭解其根源)。爲什麼第一個過濾器通過了輸入(就像它應該是這樣),但是第二個過濾器傳遞了一些過濾器對象?第二個過濾器的輸入不應該是第一個過濾器的輸出嗎?如果不是,那麼我不得不擔心遍佈各地的過濾器排序。

回答

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中的一個有效的標量,但測試::基地::過濾器會忽略它。通常,過濾器的輸入將首先是數據,然後是其他一些東西。但是,如果過濾器返回undef,那麼它的返回值將被忽略,並且下一個過濾器會減少一個參數,而不是獲取undef作爲其第一個參數。我將在RT中提交。

相關問題