質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

1956閲覧

perlのClass::Accessorを使わずに自分でアクセサを書く方法

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2016/06/30 18:55

perlのClass::Accessorを使うと以下のようにかけるかと思います

perl

1#sample.pl 2package Person; 3 4use strict; 5use warnings; 6use Data::Dumper; 7use base qw/Class::Accessor/; 8 9my $person = Person->new; 10$person->set('foo','bar'); 11print Dumper $person;

以下ターミナル画面

perl sample.pl

$VAR1 = bless( {
'foo' => 'bar'
}, 'Person' );

ターミナル画面ここまで

これと同じ結果が得られるパッケージ(?)を想定して次のプログラムをClass::Accessorのソースから大部分コピペして書いたのですがエラーが出てしまいました

perl

1#sample2.pl 2package Person; 3 4use strict; 5use warnings; 6 7sub new { 8 my($self) = shift; 9 if(@_) { # set 10 return $self->set('foo', @_); 11 } 12 else { 13 return $self->get('foo'); 14 } 15 } 16 17sub set { 18 my($self, $key) = splice(@_, 0, 2); 19 20 if(@_ == 1) { 21 $self->{$key} = $_[0]; 22 } 23 elsif(@_ > 1) { 24 $self->{$key} = [@_]; 25 } 26 else { 27 $self->_croak("Wrong number of arguments received"); 28 } 29} 30 31sub get { 32 my $self = shift; 33 34 if(@_ == 1) { 35 return $self->{$_[0]}; 36 } 37 elsif( @_ > 1 ) { 38 return @{$self}{@_}; 39 } 40 else { 41 $self->_croak("Wrong number of arguments received"); 42 } 43} 44 45my $person = Person->new; 46$person->set('foo', 'bar'); 47

エラー内容:Can't use string ("Person") as a HASH ref while "strict refs" in use at sample2.pl line 34.

自分で書いた方のプログラムですとnewメソッド、setメソッド、getメソッド全て上手くかけていないようなのですが原因がわかりません

Class::Accessorを使わずにClass::Accessorと同じ値を返してくれるnewメソッド、setメソッド、getメソッドを書く方法を教えてください
よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

newbless していないので、オブジェクト指向としては動きません。
sub new {} を、Class::Accessor 本来の以下のコードに差し替えてください。

sub new { my($proto, $fields) = @_; my($class) = ref $proto || $proto; $fields = {} unless defined $fields; # make a copy of $fields. bless {%$fields}, $class; }

foo の初期値を与えるコードなどの改造は、その後に考えてみてください。

投稿2016/06/30 21:28

bunzaemon

総合スコア118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/01 04:25

回答ありがとうございます おかげさまで解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問