- ベストアンサー
perlのリファレンス
Perlのクラスとそのインスタンスについて疑問があります。 newでインスタンスを生成して、それを代入した場合には オブジェクトはコピーされるのでしょうか? $a = new MyClass; $b = $a; # aをコピーしてbを作る? この状態の時にaとbが同じインスタンスを指しているのか、 コピーされた別のインスタンスを指しているのかわかりません。 コピーされるとして、逆にコピーしない方法はありますか? PHPでいうと以下の書式のことがしたいのです。 $b =& $a; リファレンスを使えばできそうですが、なんだか2回コピーしている ような気がします。 $ref_b = \$a; $b = $$reb_b; PHPでいう is_a のような関数が見つけられなかったので、 どうやって上記のことを確認すればよいのかわかりません。 Perlの代入はすべてコピーと考えてよいでしょうか? アドバイスなどいただけると幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
new して返ってくるのはインスタンスのリファレンスなので、Cで言うところのポインタの持ち回りと一緒です。 やっつけで↓のようなスクリプトを書いてみました。 package Foo; sub new { my $self; $self = {}; $self->{value} = shift; bless $self; return $self; } package main; my $foo = Foo::new("hello, world"); print $foo, "\n"; my $bar = $foo; print $bar, "\n"; my $baz = Foo::new("Howdy!"); print $baz, "\n"; $baz = $foo; print $baz, $baz->{value}, "\n"; $baz->{value} = "hogehoge"; print $foo->{value}, "\n"; 実行例です。 Foo=HASH(0x1635db8) Foo=HASH(0x1635db8) Foo=HASH(0x1635fc8) Foo=HASH(0x1635db8)hello, world hogehoge 見ての通り、リファレンスを代入しても中身がコピーされることはありません。 逆に別の変数を経由して中身を書き換えると、元のものにも影響します。
その他の回答 (3)
- rafysta
- ベストアンサー率45% (24/53)
オブジェクトはコピーされません。 オブジェクトのコピーは、Storableモジュールが便利です。
お礼
お礼が遅れてすいません。 どうもありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
おまけ: 普通 new が返すのはリファレンスですが, どうにも気になるときには attributes モジュールの reftype って関数が使えるかも. my $a = new MyClass; eval { attributes::reftype($a); }; # $@ eq '' なら $a はリファレンス
お礼
お礼が遅れてすいません。 どうもありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
new してるってことは new の中で bless してると思うので, リファレンスが返ってきているんじゃないでしょうか. で, このリファレンスを代入しますから, 「同じインスタンス」を指すと思います.
お礼
お礼が遅れてすいません。 どうもありがとうございました。
お礼
お礼が遅れてすいません。 どうもありがとうございました。