青山です。

On Thu, 2 Dec 1999 19:13:31 +0900,
"Hideaki Takata" <hideakit / d3.dion.ne.jp> wrote:

> # ひまになったらPerlの$演算子を
> # Rubyのメソッドとして実装してみよう

デリファレンス-->その文字列を実行文として評価-->eval と思われますから、
やはり eval になるかと思います。例えば、Programming Perl (青本の方)の
4章に次のような例があります。

@john = (47, "brown", 186);
@mary = (23, "hazel", 128);
@bill = (35, "blue", 157);
@vitals = ('john', 'mary', 'bill');

このようなデータに対して @john の "brown" を "red" にする場合、次のよ
うにしなければならないと書かれています。

$vital = $vitals[0];
eval "\$${vital}[1] = 'red'";

この eval を見えなくしたのが、Perl 5 で登場した $, @, % 等を重ねてデリ
ファレンスするという拡張ですね。本には書いてありませんが、こんな感じに
なるでしょう。

$vital = $vitals[0];
${$vital}[1] = 'red';

Ruby でいってみると、データ生成は次のようになります。

john = [47, "brown", 186]
mary = [23, "hazel", 128]
bill = [35, "blue", 157]
vitals = ['john', 'mary', 'bill']

そして、最初の例は次のようになります。

vital = vitals[0]
eval "#{vital}[1] = 'red'"

そして、後者の例は次のようになるでしょう。

vital = vitals[0]
eval(vital)[1] = 'red'

って、ここまで書いてしまっては、楽しみが無くなってしまうでしょうかね。
まあ、書いてしまったので、ついでに。

alias d eval
d(vital)[1] = 'red'

$ は予約語で使えませんから d にしましたけが、これで Perl とほぼ同じで
しょう。ブロックを受け取れるように工夫すれば d{vital}[1] = 'red' のよ
うに、より一層 Perl 風にもできますね。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>