實質性
常規地,封裝XYZ
被保持在一個文件中XYZ.pm
;否則Perl將無法找到您的軟件包。因此,您的文件應該是CC.pm
而不是script.pm
。
注意,一個包Organization::Team::Purpose
被保持在一個文件中Purpose.pm
,但該文件被保持在子目錄Organization/Team
和基本目錄保持Organization
已經由Perl的發現(使用-I/some/where
如果Organization
是的子目錄例如,目錄/some/where
;如果它是當前目錄的子目錄,則它將被發現)。
您應該在連接嘗試後檢查or
子句。通常,您在那裏做die
或croak
。您只需評估一個字符串,這不是很有用。
您有:
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 }
它不會直接影響操作的代碼。它確實使它不那麼容易閱讀。學會一致是學習編程的重要組成部分。
什麼問題?你有錯誤信息嗎? – Nick
請使用您的代碼的代碼塊格式化您的問題。如果你不知道如何,就問。 – toolic
這是昨天的問題的擴展版本 - 它比昨天的問題更好,因爲它包括一些批評的代碼,但沒有很好的解釋問題是什麼。 –