'未加引号的字符串“..”可能会与未来的保留字冲突,但仅限于使用包时

时间:2014-02-18 01:48:00

标签: 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;

_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;)并且它已经完美地工作直到我尝试使用它我开始尝试使用对象的模块,即“包”。那么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

_mypkg.pm中,您可以在use _debug;声明之前致电package mypkg;。这意味着Perl读取默认命名空间(_debug.pm)中的main文件,print_nowbprintdprint子例程在{ {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;