我有以下代码:
#! /usr/bin/perl -T
{
package MSG;
use strict;
use warnings;
sub info
{
print STDERR join("\n", @_), "\n";
}
sub import
{
no strict 'refs';
*{caller().'::info'} = \&info;
}
}
{
package main;
use strict;
use warnings;
MSG->import;
# sub info;
info "a", "b";
}
如果sub info;
包中没有main
行,我会收到以下错误:
String found where operator expected
我认为理由是here。当我添加该行时,代码按预期工作。但我不希望它出现在main
包中。
如何将sub info;
的内容移动到import
包的MSG
函数中?
答案 0 :(得分:2)
大多数人使用Exporter。
BEGIN {
package MSG;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( info );
sub info {
print STDERR join("\n", @_), "\n";
}
}
{
use strict;
use warnings;
BEGIN { MSG->import; }
info "a", "b";
}
BEGIN
周围的import
可确保在编译info
之前导入符号。使用use
会更加清晰,这可能会使用很小的变化。
BEGIN {
package MSG;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( info );
sub info {
print STDERR join("\n", @_), "\n";
}
$INC{"MSG.pm"} = 1;
}
{
use strict;
use warnings;
use MSG;
info "a", "b";
}