私はPerlクラスのimport
メソッドを実装して、Data
オブジェクトをインスタンス化しようとしています。これは本質的に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
で何が起こっているかに多くの明快さを追加しませんでした:
Can't bless non-reference value
(F)
Only hard references may be blessed. This is how Perl "enforces" encapsulation of objects. Seeperlobj
.
私も、オブジェクトを初期化し、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...
つの質問:私は何をやったかと間違って何
- ?
- 誰かこのコンパイル時エラーの説明を
perldiag
で明示してください。
Hindsight:警告/エラーメッセージを理解するために 'perldiag'より優れたリファレンスはありますか? – Zaid
一般に、前提条件のプリントを挿入することで、このようなエラーを攻撃することができます。この場合、あなたのサブルーチンへの引数。 ( 'print" import got:@_ \ n ";')それはあなたが配列であると思ったものが実際にはなかったことをあなたに知らせてくれました。次に、 'ref $ data eq 'ARRAY'のようなガードを追加するか、配列ではないことを告白します: '$ data'";そして、違反の呼び出しがどこから来ているかを知るでしょう。 ( '告白は' Carp 'を告白してから ''告白し、完全なバックトレースを提供する) ''詐欺'に変わって、おそらく将来的に他のエラーを直ちに捕まえるのを助けるかもしれないので、 –
@ Lance Roberts:元のタイトルは、['Acme :: Damn'](http://search.cpan.org/perldoc?Acme::Damn)モジュール(これは、 'bless') – Zaid