2011-02-19 21 views
-2

可能性の重複を必要とするで失敗しました:
error of importing DBI in Perl問題 - コンパイルは

私は別のモジュール、script.pmにDBIモジュールを使用する場合、私は問題を抱えています。これはパッケージで、あなたのコードサンプルは、次のようにあなたの.pmファイルに最後の行を追加してみてください「1;」で終わっていないという事実から判断

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.pmに保持されXYZパッケージ。 Perlはあなたのパッケージを見つけられません。したがって、ファイルはscript.pmではなくCC.pmである必要があります。

パッケージOrganization::Team::PurposeがファイルPurpose.pmに保持されているが、ファイルはサブディレクトリOrganization/Teamに保持され、Organizationでのサブディレクトリである場合Organizationを保持するベース・ディレクトリが-I/some/whereを用いて(パールによって発見されなければならないことを注意たとえば、ディレクトリ/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"; 

ことの欠点は、これがモジュールに起こっているということであり、それはにISNモジュールの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 } 

:最初は少しより多くのスペースの恩恵を受ける可能性がある

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

をコードのそれは少し読みにくいです。一貫していることを学ぶことは、プログラムの学習の重要な部分です。

1

1; 

Perlのモジュールはuserequire経由で正常にロードされるように、do経由評価時に真の値を返す必要があります。

ファイルが最後にsとtrueを返す必要がありますすべての初期化コードが正常に実行されたことを示すために、このようなファイルを1で終了するのが通例です。それ以外の場合はtrueを返すかどうか確かめない限り。しかし、それを置く方が良いです。より多くのステートメントを追加する場合に使用します。