質問
冗談はさておき、私は import
Perl クラスのメソッドをインスタンス化する Data
オブジェクトは、本質的に、適切な hashref 配列からの、美化された hashref 配列です。
これを使用する方法の例を次に示します。
# 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)
ハードリファレンスのみが祝福される可能性があります。これが、オブジェクトのカプセル化を「強制」する方法です。見る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 つの質問:
- 私のしたことの何が間違っているのでしょうか?
- 誰かがそれを明確にしてもらえますか
perldiag
このコンパイル時エラーの説明は?
解決
Perl は時々「import」というメソッドを呼び出すことがあるため、import() という名前をメソッドに付けるのは危険です。実際、次のステートメントは次のとおりです。
use Data;
本当に意味するのは:
BEGIN {
require Data;
Data->import();
}
これは「コンパイル」中に発生します。
そのため、import() メソッドは、使用する前にクラス読み込みメカニズムの一部として Perl によって呼び出されている可能性があります。import() メソッドの名前を別の名前に変更する必要があります (例:import_data) で問題ないはずです。
所属していません StackOverflow