2012-01-13 17 views
2

私はperlスクリプトにuse strict;use warnings;を持っています。perlのOOコードで未定義キーをチェックする方法は?

しかし、このエラーが見つかりません。

sub new { 
    #.... 
    my $self={}; 
    $self->{databas}="..."; # 'e' is missing 
    #.... 
} 

sub foo { 
    my $self=shift; 
    print $self->{database}; # undef 
} 

私はsub newにmispelledにそのデータベースを発見するために時間を費やしています。

use strict;use warnings;でした。

このエラーを回避するにはどうすればよいですか?

答えて

8

制限/ロックハッシュはHash::Utilです。


また、スペルミスの属性に実行時エラーを作り、自分のクラスを記述するためにMooseを使用しています。

package MyClass; 
use Moose; 
has 'database' => (isa => 'Str', is => 'rw', default => 'quux'); 

sub foo { 
    my ($self) = @_; 
    $self->database; # returns quux 
    $self->databas; # Can't locate object method "databas" via package… 
1

使用defined、または//オペレータ(後でperlの5.10 /を持っている場合)

print "not defined" if !defined $a; # check if $a is undef 

print $a // 'undefed!';    # print a if availiable, "undefed!" otherwise 

http://perldoc.perl.org/functions/defined.htmlhttp://perldoc.perl.org/perlop.html#C-style-Logical-Defined-Or

+0

感謝を。しかしこれはあまりにも多い。私はすべてのvarの前に定義する必要があります。自動チェックに役立つモジュールはありますか? – everbox

+0

あなたの '$ self - > {databas}'構文は、新しい鍵の作成方法です。これでエラーが発生した場合、モジュールは最初にそのキーをどのように作成しますか? –

+0

期待されるすべてのハッシュ値がサブ開始時にあることを確認し、欠落している場合は停止することができます。一度に多数をチェックすることができ、変数ごとに1行は必要ありません。 –

1

使用ゲッターとセッターの代わりに、ハッシュキーを参照してください、またはムースに切り替えます。

1

ハッシュが破棄されたことがわかったら、それを見つけたと思いますか?このように:あなたは不思議に思った場合は

$self = bless({ 
       'anotherfield' => 'something else', 
       'databas' => '...', 
       'afield' => 'something' 
       }, 'MyClass'); 

「?!?!どのように 『データベース』 設定されていません」と、あなたはこれをダンプし、あなたはそれが役立つだろうと思いますか? "ああ、それは 'database'ではなく 'databas'を割り当てました!"その後Data::Dumper

は、最小限のPerlのデバッグツールもちろん

use Data::Dumper; 
... 
# Why isn't database assigned?!?! 
say Data::Dumper->Dump([ $self ], [ '$self' ]); 

Data::Dumperツールの最も便利なフォームがSmart:Commentsです。

出力
use Smart::Comments; 
... 
### $self 

### $self: bless({ 
###     afield => 'something', 
###     anotherfield => 'something else', 
###     databas => '...' 
###    }, 'MyClass') 

をそれはムースとして予防ツールとしてではないのですが、それはしかし、時間を保存します。私はCPANオブジェクトの大惨事を吐き出しながら、Perlのトリックとプラクティスを学ぶのにも役立つと思います。基本的な構造を知っているときは、CPANモジュールで検索するものがあります。

私が言ったように、それは時間(多くの場合、十分な場合があります)を追跡するという問題を解決します。

0

もう1つの方法は、コアモジュールClass::Structを使用することです。

package MyObj; 

use Class::Struct; 

struct(
    databas => '$', 
    # ... 
); 

1; 

package main; 

# create object 
my $obj = MyObj->new(databas => 'MyDB'); 

# later 
print $obj->database; 

これを実行すると、次のエラーが発生:

Can't locate object method "database" via package "MyObj" at ... . 
関連する問題