• ベストアンサー

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の代入はすべてコピーと考えてよいでしょうか? アドバイスなどいただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

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 見ての通り、リファレンスを代入しても中身がコピーされることはありません。 逆に別の変数を経由して中身を書き換えると、元のものにも影響します。

angband
質問者

お礼

お礼が遅れてすいません。 どうもありがとうございました。

その他の回答 (3)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.4

オブジェクトはコピーされません。 オブジェクトのコピーは、Storableモジュールが便利です。

angband
質問者

お礼

お礼が遅れてすいません。 どうもありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

おまけ: 普通 new が返すのはリファレンスですが, どうにも気になるときには attributes モジュールの reftype って関数が使えるかも. my $a = new MyClass; eval { attributes::reftype($a); }; # $@ eq '' なら $a はリファレンス

angband
質問者

お礼

お礼が遅れてすいません。 どうもありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

new してるってことは new の中で bless してると思うので, リファレンスが返ってきているんじゃないでしょうか. で, このリファレンスを代入しますから, 「同じインスタンス」を指すと思います.

angband
質問者

お礼

お礼が遅れてすいません。 どうもありがとうございました。

関連するQ&A