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