Perl ';不带引号的字符串"&引用;可能与将来的保留字冲突';但只有在使用软件包时

Perl ';不带引号的字符串"&引用;可能与将来的保留字冲突';但只有在使用软件包时,perl,Perl,我在尝试将一个模块重构为面向对象代码时遇到了这个问题。我把范围缩小到以下几点。下面是我正在使用的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; testfile.cgi: #!

我在尝试将一个模块重构为面向对象代码时遇到了这个问题。我把范围缩小到以下几点。下面是我正在使用的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;
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;
在testfile.cgi中,导致以下(预期)输出:

printing: first
printing: second
使用-w运行脚本(无需修改)将导致错误日志中的以下输出(为清晰起见,进行了一些微调):

不带引号的字符串“dprint”可能与将来的保留字冲突
不带引号的字符串“mypkg”可能与将来的保留字冲突
在“\u mypkg.pm”处,在“dprint”pkg附近找到了运算符所需的字符串
\\n” \t(您需要预先删除dprint吗?) 第10行“dprint”pkg附近出现语法错误
\\n 在请求中编译失败

基本上,我想使用dprint(在_debug.pm中定义)来替换脚本中的“print”。。(即,没有括号或&),它一直工作得很好,直到我尝试在模块中使用它,在模块中我开始尝试使用对象。。即“包装”。那么,如何解决这个问题呢?

\u mypkg.pm
中,您可以调用
use\u debug
包mypkg之前声明。这意味着Perl读取默认命名空间(
main
)中的
\u debug.pm
文件,并且
print\u now
bprint
dprint
子例程在
main
命名空间中定义

mypkg::new
子例程在
包mypkg之后定义语句,因此它的定义发生在
mypkg
名称空间中。在该名称空间中没有定义
dprint
函数,因此Perl无法正常运行

dprint "pkg<br>\n";

这将在正确的名称空间(
mypkg
)中定义
dprint
函数。

\u mypkg.pm
中,调用
use\u debug
包mypkg之前声明。这意味着Perl读取默认命名空间(
main
)中的
\u debug.pm
文件,并且
print\u now
bprint
dprint
子例程在
main
命名空间中定义

mypkg::new
子例程在
包mypkg之后定义语句,因此它的定义发生在
mypkg
名称空间中。在该名称空间中没有定义
dprint
函数,因此Perl无法正常运行

dprint "pkg<br>\n";

这将在正确的名称空间(
mypkg
)中定义
dprint
函数。

您的代码有很多问题,其中一些问题我不确定是否有拼写错误,例如,在您的文件
\u mypkg.pm
中您有
包mypkg而不是
package\u mypkg

这是一个经过清理的版本-仔细查看差异,如果需要,请咨询。你还应该养成严格使用
的习惯
使用警告在测试时非常宝贵

_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;
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;
#/usr/bin/perl
严格使用;
使用警告;
使用mypkg;
使用_debugqw(print_now dprint);#立即导入print_()和dprint()
打印“内容类型:text/html\n\n”;
dprint“第一次
\n”; 立即打印; my$somepkg=\u mypkg->new(); 立即打印; dprint“第二次
\n”; 立即打印;
您的代码有很多问题,其中一些我不确定是否有打字错误,例如,在您的文件
\u mypkg.pm
中,您有
包mypkg而不是
package\u mypkg

这是一个经过清理的版本-仔细查看差异,如果需要,请咨询。你还应该养成严格使用
的习惯
使用警告在测试时非常宝贵

_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;
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;
#/usr/bin/perl
严格使用;
使用警告;
使用mypkg;
使用_debugqw(print_now dprint);#立即导入print_()和dprint()
打印“内容类型:text/html\n\n”;
dprint“第一次
\n”; 立即打印; my$somepkg=\u mypkg->new(); 立即打印; dprint“第二次
\n”; 立即打印;
谢谢你的回答,我确实有使用严格警告和使用警告,只是为了简洁起见,我不想将其包含在上面,因为它们不会造成问题。另外,我在文档中读到包名和模块名不必相同,因此这也不会导致问题。以“use Exporter”开头的两行代码以及在_mypkg.pm中移动包声明(给出@mob的答案)为我解决了这个问题,谢谢!谢谢你的回答,我确实使用了严格警告和使用警告,我只是不想把它包括在上面,因为它们不会造成问题。另外,我在文档中读到包名和模块名不必相同,因此这也不会导致问题。以“use Exporter”开头的两行代码以及在_mypkg.pm中移动包声明(给出@mob的答案)为我解决了这个问题,谢谢!谢谢你的回答!你的解释正是我理解发生了什么所需要的。我仍然需要添加@tangent的答案中建议的“use Exporter”行,以使其正常工作(除非您能为我解释一种不用它就能解决此问题的方法)。所以解决方案是你两个答案的混合。谢谢对不起,我想把你的答案标记为有用,但我没有足够的声誉这么做。谢谢你的回答!你的解释正是我理解发生了什么所需要的。我仍然需要添加@tangent的答案中建议的“use Exporter”行,以使其正常工作(除非您能为我解释一种不用它就能解决此问题的方法)。所以
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;
#!/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;