我知道这种我想做的事情曾经用于5.8。难道我做错了什么?在Perl 5.10中有没有办法回到那里?
这是模块:
package TableMod;
use base qw<Exporter>;
our @EXPORT_OK = qw<mod_table>;
use Data::Dumper;
sub mod_table (\%@) { print Dumper( @_ ); }
1;
以下是剧本:
use strict;
use warnings;
use Data::Dumper;
use Test::More tests => 4;
sub mod_table_here (\%@) {
print Dumper( @_ );
}
use_ok( 'TableMod', 'mod_table' );
can_ok( __PACKAGE__, 'mod_table' );
is( prototype( \&mod_table_here ), '\\%@'
, q/prototype( \&mod_table_here ) = '\%@'/
);
is( prototype( \&mod_table ), prototype( \&mod_table_here )
, 'prototypes ARE the SAME!'
);
my %table = qw<One 1>;
mod_table_here %table => ( 1, 2, 3, 4 );
#mod_table %table => ( 1, 2, 3, 4 );
mod_table( %table, 1, 2, 3, 4 );
我所要做的就是取消注释最后一行,我得到:
Useless use of modulus (%) in void context at - line 17.
Useless use of a constant in void context at - line 17.
Useless use of a constant in void context at - line 17.
Useless use of a constant in void context at - line 17.
Bareword "mod_table" not allowed while "strict subs" in use at - line 17.
它没有抱怨本地潜艇,但它对进口的潜艇失去了理智。最重要的是,尽管测试告诉我我已经导入了'mod_table',但严格现在却认为它是一个单词!
不仅如此,尽管测试告诉我原型是相同的,但我不能将%table
作为hashref传递给导入的sub。即使我使用传统语法,也不会显示在最后一行。
我得到的是:
1..4
ok 1 - use TableMod;
ok 2 - main->can('mod_table')
ok 3 - prototype( \&mod_table_here ) = '\%@'
ok 4 - prototypes ARE the SAME!
$VAR1 = {
'One' => '1'
};
$VAR2 = 1;
$VAR3 = 2;
$VAR4 = 3;
$VAR5 = 4;
$VAR1 = 'One';
$VAR2 = '1';
$VAR3 = 1;
$VAR4 = 2;
$VAR5 = 3;
$VAR6 = 4;
答案 0 :(得分:10)
因为use_ok
在运行时被调用。如果你添加以下内容,那么一切正常:
use TableMod 'mod_table';
我通常只保留一个use_ok
的测试文件(通常 00-load.t 或 00-use.t )。我想Ovid可能写了一篇博文,说这是一个好习惯吗?
更新:找到Ovid's blog post我指的是。
/ I3az /
答案 1 :(得分:7)
这是预期的结果。 use_ok调用是在运行时调用的,所以mod_table sub只在编译时遇到“”之后才会编译和导入,因此对mod_table的“调用”被解释为非法的裸字
此代码在5.8和5.10上产生相同的警告/错误。
perl -e'use strict; use warnings; my %table; mod_table %table => (1,2,3,4)'
因为缺少编译时导入会影响编译的测试代码
像这样,除了a之外,在所有测试中使用use
代替use_ok是个好主意
专门用于执行use_ok的测试(可能使用BAIL_OUT)。
(将use_ok置于BEGIN块中可以缓解这些问题但可能导致问题
其他问题,所以不是一个好主意。)