1

ハッシュを使用してコンストラクターを呼び出す際に問題が発生します。エラーが発生します:

「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);

なぜこのエラーが発生するのですか? それはどのように解決されますか?

どうも :)

4

2 に答える 2

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

したがって、「Sumcheck」(パッケージ名)はに配置され$debug、0はに配置され$debug_matches、ハッシュの最初の要素は1になり、次のようになります。

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

参考までに、この方法で呼び出されるオブジェクトメソッドへの最初の暗黙の引数(2行目):

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

$ obj、別名になります。メソッド内$self

sub someMethod {
    my $self = shift

これは、コンストラクターによって返される祝福されたハッシュnew()です。

于 2012-05-01T11:10:44.927 に答える
1

まず、プログラムでは必ずandを使用してください。 use strictuse warnings

クラスのオブジェクトを作成するときはいつでも、最初のパラメーターは常にクラスのインスタンスであるため、プログラムは期待どおりに機能しないため、次のように記述します。

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; 

上記のコードはあなたの問題を解決します。

于 2012-05-01T11:38:08.133 に答える