「一気に最後まで読んだ」本、教えて下さい!

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

A 回答 (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

見ての通り、リファレンスを代入しても中身がコピーされることはありません。
逆に別の変数を経由して中身を書き換えると、元のものにも影響します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/18 14:10

オブジェクトはコピーされません。


オブジェクトのコピーは、Storableモジュールが便利です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/18 14:11

おまけ:


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

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

お礼日時:2007/06/18 14:10

new してるってことは new の中で bless してると思うので, リファレンスが返ってきているんじゃないでしょうか. で,

このリファレンスを代入しますから, 「同じインスタンス」を指すと思います.
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/18 14:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報