2014-02-18 20 views
0

我在嘗試將我的某個模塊重構爲面向對象的代碼時遇到了此問題。我把它縮小到以下。下面是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定義)在我的腳本來代替「打印」。(即不帶括號或&),它完美地工作直到我嘗試在模塊中使用它,我bega ñ試圖使用對象..即「包」。那麼,我該如何解決這個問題?

回答

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; 
+0

感謝您的回答,我的確使用嚴格的使用警告,我只是爲了簡潔而不想將其包含在內,並且因爲他們沒有對問題做出貢獻。另外,我在文檔中看過,軟件包名稱和模塊名稱不一定是相同的,所以也不會導致問題。以「使用Exporter」開頭的兩行以及在_mypkg.pm中移動包聲明(給出@ mob的答案)是爲我解決了這個問題,謝謝! – insaner

3

_mypkg.pm中,您在package mypkg;宣告之前致電use _debug;。這意味着Perl在缺省命名空間(main)中讀取_debug.pm文件,並且在main命名空間中定義了print_now,bprintdprint子例程。

mypkg::new子程序在package mypkg;語句之後定義,因此其定義發生在mypkg命名空間中。有在該命名空間中沒有定義dprint功能,所以Perl的扼流圈上線

dprint "pkg<br>\n"; 

解決方法是切換usepackage語句的順序:

_mypkg.pm:

package mypkg; 
use _debug; 
use _debug dprint; 
... 

這將在正確的名稱空間(mypkg)中定義dprint函數。

+0

感謝您的回答!你的解釋正是我需要了解發生了什麼。我仍然需要在@ tangent的答案中添加「使用Exporter」這一行,以便它能夠正常工作(除非你可以解釋一種方法讓我解決這個問題)。所以解決方案是你的答案的組合。謝謝! – insaner

+0

對不起,我想標記你的答案是有用的,但我沒有足夠的聲望去做。 – insaner

相關問題