2012-05-01 15 views
1

コンストラクタをハッシュで呼び出すときに問題があります。 エラー:Perl - コンストラクタのハッシュ割り当ての要素数が奇数

"Sumcheck.pmの4行目のハッシュ割り当てで奇数の要素です。" Sumcheck.pmは次のようになります。

package Sumcheck; 

sub new { 
    my ($debug, $debug_matches,%checkHash) = @_; 
    my $self = {}; 
    $self->{DEBUG} = $debug; 
    $self->{DEBUG_MATCHES} = $debug_matches; 
    $self->{CHECKRESULT_OK} = "COMPLIANT"; 
    $self->{CHECKRESULT_ERROR} = "NONCOMPLIANT"; 
    $self->{checkHash} = %checkHash; 
    #print %checkHash; 

    bless($self); 
    return $self; 
} 
1; 

、私はこの(単にランダムなハッシュ)のようにそれを呼び出す:私はこのエラーが出るのはなぜ

use Sumcheck; 
$debug = 0; 
$debug_matches = 1; 

%checkHash = ( 'The Shining'  => 'Kubrick', 
       'Ten Commandments' => 'DeMille', 
       'Goonies'   => 'Donner',); 

$sumCheck = Sumcheck->new($debug, $debug_matches, %checkHash); 

?どのように解決されますか?このように呼ばれるメソッドへ

Thxを:)

+0

オブジェクトに* reference *を '%checkHash'に保存することを意味しますか? '$ self - > {checkHash} =%checkHash' [sic]はあなたが望むことをしません。 – pilcrow

答えて

2

最初の暗黙の引数:

MyPackage->someMethod() 

はパッケージの名前です。例:

package MyPackage; 

sub someMethod { 
    print shift; 

mypackageとが得られます。

コンストラクタへのアイデアWRTがある:

sub new { 
    my $class = shift; # now your $debug would be $_[0], so: 
    my $self = { @_ }; # <- replace this with your own details 
    bless $self, $class; 
} 

あなたはまさにそれを行う必要はありませんが、あなたのハッシュが奇数の要素を持っているなぜあなたは今見ていますか? Sumcheck::newでは、$debugはそれがあなたが思うものではありません(チェックしてください)。覚えておいて、ハッシュはこのようなリストとして文字通り渡されます

name, value, name, value 

ので、「サムチェック」(パッケージ名)が$debugに置かれます、0が$debug_matchesに置かれます、ハッシュの最初の要素が1です、このにつながる:

1 => `The Shining` 
'Kubrick' => 'Ten Commandments', 
'DeMille' => 'Goonies', 
'Donner' => # uneven number of elements error 

FYI、この方法(第2ライン)と呼ばれるオブジェクトのメソッドへの最初の暗黙の引数:

my $obj = Sumcheck->new(..,.); 
$obj->someMethod(); 

は別名、$ OBJなります。

sub someMethod { 
    my $self = shift 

コンストラクタ、new()によって返さ祝福ハッシュである:方法で$self

+0

hmmはい私は良い説明のために - thxを見る。私もそれをテストしました - 同じ結果で:)。しかし、私はまだあなたがこれを解決する方法を見ることができません。 – Diemauerdk

+0

パッケージサブで最初に行うことは、最初の暗黙の引き数をシフトオフすることです。例えば、 '$ self'メソッドです。コンストラクタの場合、 '$ obj-> new()'ではなく、 'Sumcheck-> new()'を介して呼び出されたので、クラスの名前として扱います。これは '祝福。私の例 'new()'を見てみましょう。あなたは '$ self = {@_}'行をあなたが望むものに置き換えたいと思うでしょう - おそらく 'my($ debug、$ debug_matches、%checkHash)= @ _;' – delicateLatticeworkFever

+0

thxはそれを試しました - それは今働いています:ゴールロックとNikhil Jainの両方に多くのことをthx! – Diemauerdk

1

まず、常にuse strictuse warningsをあなたのプログラムで使用してください。

プログラムを使用すると、クラスのオブジェクトを作成するたびに、最初のパラメータは常にクラスのインスタンスであるので、この方法のようにそれを書くbecuase、あなたが期待どおりに動作しません。

package Sumcheck; 
use strict; 
use warnings; 

    sub new { 
    # $checkhash variable holds the reference of the hash. 
    my ($class, $debug, $debug_matches,$checkHash) = @_; #$class would hold the instance 
    my $self = {}; 
    $self->{DEBUG} = $debug; 
    $self->{DEBUG_MATCHES} = $debug_matches; 
    $self->{CHECKRESULT_OK} = "COMPLIANT"; 
    $self->{CHECKRESULT_ERROR} = "NONCOMPLIANT"; 
    $self->{checkHash} = %{$checkHash}; 
    #print %checkHash; 
    bless($self); 
    return $self; 
    } 
    my %test = (abc => "30"); # for testing 
    # pass hash as reference 
    my $sumcheck = Sumcheck->new('test', 'test20', \%test); 
    print"$sumcheck->{DEBUG}"; # for testing 
    1; 

コードの上になりますあなたの問題を解決してください。

+0

引数の処理を 'my(...、%h)= @ _'から' my(...、$ h)= @ _'に変更しました。古い問題の場所(不適切なハッシュ割り当て)。 – pilcrow

+0

@pilcrow:私はOPに、 'my $ sumcheck = Sumcheck-> new( 'test'、 'test20'、\%test);のようにハッシュリファレンスを渡すことを提案しています。不適切なハッシュ割り当てのような問題はありません。 –

+0

はい、私は知っていますが、あなたはメソッドの呼び出しパラメータを変更してOPの呼び出しを破っていると説明していません。 :) – pilcrow

関連する問題