我在尝试将我的一个模块重构为面向对象的代码时遇到了这个问题。我把它缩小到以下。这是我正在使用的3个文件的列表:
_mypkg.pm:
use _debug;
use _debug dprint;
package mypkg;
sub new {
my($class,%args) = @_;
my $self = bless {}, $class;
dprint "pkg<br>\n";
return $self;
}
1;
_debug.pm:
# package mydebug; # uncommenting this line gives error 500
my $bprint = "";
sub print_now { print "printing: ".$bprint; $bprint = "";}
sub bprint { $bprint .= "@_"; }
sub dprint { bprint @_; }
1;
testfile.cgi:
#!/usr/bin/perl
require '_mypkg.pm';
#require '_debug.pm';
#use _debug;
use _debug dprint;
print "Content-type: text/html\n\n";
dprint "first<br>\n";
&print_now;
my $somepkg = mypkg->new();
dprint "second<br>\n";
&print_now;
如上所示,没有输出,但注释掉了这些行:
require '_mypkg.pm';
my $somepkg = mypkg->new();
在testfile.cgi中,导致以下(预期)输出:
printing: first
printing: second
使用-w运行脚本(不做修改)会导致错误日志中出现以下输出(为了清楚起见,略微修剪):
Unquoted string "dprint" may clash with future reserved word
Unquoted string "mypkg" may clash with future reserved word
String found where operator expected at _mypkg.pm, near "dprint "pkg<br>\\n""
\t(Do you need to predeclare dprint?)
syntax error at _mypkg.pm line 10, near "dprint "pkg<br>\\n""
Compilation failed in require
基本上,我想使用dprint(在_debug.pm中定义)来替换我的脚本中的“print”..(即没有括号或&amp;)并且它已经完美地工作直到我尝试使用它我开始尝试使用对象的模块,即“包”。那么,我该如何解决这个问题?
答案 0 :(得分:3)
在_mypkg.pm
中,您可以在use _debug;
声明之前致电package mypkg;
。这意味着Perl读取默认命名空间(_debug.pm
)中的main
文件,print_now
,bprint
和dprint
子例程在{ {1}}命名空间。
main
子例程在mypkg::new
语句之后定义,因此其定义发生在package mypkg;
命名空间中。该命名空间中没有定义mypkg
函数,因此Perl在行
dprint
修复方法是切换dprint "pkg<br>\n";
和use
语句的顺序:
_mypkg.pm:
package
这将在正确的命名空间(package mypkg;
use _debug;
use _debug dprint;
...
)中定义dprint
函数。
答案 1 :(得分:3)
您的代码存在很多问题,其中一些我不确定是否存在拼写错误,例如,在您的_mypkg.pm
文件中package mypkg;
代替package _mypkg;
}。
这是一个清理版本 - 仔细查看差异,如果需要,请咨询perldocs。您还应该养成将use strict;
和use warnings;
置于脚本顶部的习惯,并且在cgi环境中use CGI::Carp('fatalsToBrowser');
在测试时非常有用。
_mypkg.pm
package _mypkg;
use _debug qw(dprint); # import dprint()
sub new {
my($class,%args) = @_;
my $self = bless {}, $class;
dprint "pkg<br>\n";
return $self;
}
1;
_debug.pm
package _debug;
use Exporter 'import';
our @EXPORT_OK = qw(print_now dprint);
my $bprint = "";
sub print_now { print "printing: ".$bprint; $bprint = "";}
sub bprint { $bprint .= "@_"; }
sub dprint { bprint @_; }
1;
testfile.cgi
#!/usr/bin/perl
use strict;
use warnings;
use _mypkg;
use _debug qw(print_now dprint); # import print_now() and dprint()
print "Content-type: text/html\n\n";
dprint "first<br>\n";
print_now;
my $somepkg = _mypkg->new();
print_now;
dprint "second<br>\n";
print_now;