2011-02-19 40 views
-2

可能重複:
error of importing DBI in Perl問題 - 編譯失敗中需要

我有一個問題,當我使用DBI模塊中的另一個模塊,script.pm

package CC; 


use DBI; 
use strict; 
use Alias; 


my $dbFile = 'XXXXXXXX.db'; 

my $db = DBI->connect("dbi:SQLite:$dbFile","","", 
    {RaiseError =>1, AutoCommit => 1})or "Unable to connect: $DBI::errstr\n"; 


use Alias qw(attr); 
our ($CURRENTOFFSET,@LANGUAGE); 

sub new { 
    my $that = shift; 
    my $class = ref($that)|| $that; 
    my $self = { 
     CURRENTOFFSET=> undef, 
     LANGUAGE => [] 
    }; 
    bless($self, $class); 
    return $self; 
} 
+5

什麼問題?你有錯誤信息嗎? – Nick

+1

請使用您的代碼的代碼塊格式化您的問題。如果你不知道如何,就問。 – toolic

+0

這是昨天的問題的擴展版本 - 它比昨天的問題更好,因爲它包括一些批評的代碼,但沒有很好的解釋問題是什麼。 –

回答

4

實質性

常規地,封裝XYZ被保持在一個文件中XYZ.pm;否則Perl將無法找到您的軟件包。因此,您的文件應該是CC.pm而不是script.pm

注意,一個包Organization::Team::Purpose被保持在一個文件中Purpose.pm,但該文件被保持在子目錄Organization/Team和基本目錄保持Organization已經由Perl的發現(使用-I/some/where如果Organization是的子目錄例如,目錄/some/where;如果它是當前目錄的子目錄,則它將被發現)。

您應該在連接嘗試後檢查or子句。通常,您在那裏做diecroak。您只需評估一個字符串,這不是很有用。

您有:

my $db = DBI->connect("dbi:SQLite:$dbFile","","", 
    {RaiseError =>1, AutoCommit => 1})or "Unable to connect: $DBI::errstr\n"; 

您應該考慮做什麼,但一個方法是:

use Carp; 
my $db = DBI->connect("dbi:SQLite:$dbFile", "", "", 
         { RaiseError => 1, AutoCommit => 1 }) 
     or croak "Unable to connect: $DBI::errstr\n"; 

的,不好的一面是,這是進入一個模塊,它不是」在模塊的BEGIN代碼中敲擊一個好主意(我假設代碼是在模塊被加載時執行的)。您可能需要存儲undef數據庫句柄並保護其他方法不使用它。在使用構造函數new(可能是第一次)之前,延遲「連接到數據庫」操作可能會更好。在這一點上提出錯誤至少是合法的。

正如DVK指出的答案(在我寫我的答案之前),模塊應以1;結束以指示成功加載。也許你可以利用它來報告加載失敗時的錯誤 - 最終的條件可能是'defined $db ? 0 : 1;'(或者甚至只是'defined $db;'),但是以某種方式生成錯誤消息來解釋問題是至關重要的。

瑣事

你應該在各地運營商的間距無情一致了。你舉的例子包括:

{RaiseError =>1, AutoCommit => 1} 
my $class = ref($that)|| $that; 
CURRENTOFFSET=> undef, 

這將更好的寫法如下:

{RaiseError => 1, AutoCommit => 1} 
my $class = ref($that) || $that; 
CURRENTOFFSET => undef, 

第一個可以從多一點空間中受益:

{ RaiseError => 1, AutoCommit => 1 } 

它不會直接影響操作的代碼。它確實使它不那麼容易閱讀。學會一致是學習編程的重要組成部分。

1

的事實,這是一個包,你的代碼示例不以「1;」,嘗試將最後一行到你的.pm文件,如下所示結束判斷:

1; 

Perl模塊必須通過do評估後返回真值,可以通過userequire成功加載:

文件必須返回作爲最後的真實表示成功執行任何初始化代碼,所以通常以1結束這樣的文件;除非你確定它否則會返回true。但是最好放1; ,以防你添加更多的語句。