13

import駄洒落はさておき、 Perl クラスにメソッドを実装してData、ハッシュリファレンスの適切な配列から、本質的にハッシュリファレンスの美化された配列であるオブジェクトをインスタンス化しようとしています。

これを使用する方法の例を次に示します。

# Pull in the data
my $data = Data->import(
                         [
                           { a => 1, b => 7, c => 3},
                           { a => 7, b => 9, c => 2},
                         ]
                       );

$data->manipulate;  # Use package methods

私のimport実装は次のとおりです。

package Data;

sub initialize {
    my $class = shift;
    my $data = [];
    bless $data, $class;
    return $data;
}

sub import {

    my ( $class, $data ) = @_;

    bless $data, $class;
    return $data;
}

1;

驚くべきことは、 Perlがコンパイルにエラーを報告することです(BEGINブロックに注意してください):

Can't bless non-reference value at Data.pm line 51.
BEGIN failed--compilation aborted at myScript.pl line 8.

perldiag何が起こっているのかをあまり明確にしませんでした:

参考値以外は祝福できない

(F)ハードリファレンスのみが祝福されます。これが、Perl がオブジェクトのカプセル化を「強制」する方法です。を参照してください perlobj


オブジェクトの初期化とデータの追加を 2 つの別々の手順で試してみました。

sub import {                         #< Another constructor >

    my ( $class, $data ) = @_;

    my $obj = $class->initialize;
    push @$obj, @$data;

    return $obj;
}

これにより、次のコンパイル時エラーが発生しました。

Can't use an undefined value as an ARRAY reference...
BEGIN failed--compilation aborted at...

2 つの質問:

  1. 私がしたことの何が問題なのですか?
  2. 誰かperldiagがこのコンパイル時エラーの説明を明確にしてもらえますか?
4

1 に答える 1

21

import() は、Perl が 'import' と呼ばれるメソッドを呼び出すことがあるため、メソッドに付けるのは危険な名前です。実際、声明は次のとおりです。

use Data;

本当に意味:

BEGIN {
    require Data;
    Data->import();
}

これは「コンパイル」中に発生します。

したがって、あなたの import() メソッドは、それを使用する機会を得る前に、クラス ローディング メカニズムの一部として Perl によって呼び出されている可能性があります。import() メソッドの名前を別のもの (例: import_data) に変更する必要があります。

于 2011-09-11T10:04:42.363 に答える