PerlまたはJavaScriptの質問です。Pythonではtype(obj)でオブジェクトのタイプ(整数とかリストとか)がわかり、dir(obj)でそのオブジェクトが持っているフィールドやメソッドの名前がわかります。PerlやJavaScriptに似たような機能はありますか?

回答の条件
  • 1人2回まで
  • 登録:2006/05/24 00:24:34
  • 終了:2006/05/25 13:16:28

回答(3件)

id:Kumappus No.1

くまっぷす回答回数3784ベストアンサー獲得回数1852006/05/24 00:58:53

ポイント30pt

dir(obj)に相当するものはよくわからなかったのですが、

Javascriptにはtypeof()演算子があり

http://www.res-system.com/item/505

Perlにはref演算子があって

http://www.7key.jp/program/perl/ref.html

http://www.rfs.jp/sb/perl/02/10.html

同じような用途に使えるようです。

id:westfish

なるほど、これで行けそうですね。ありがとうございました。

ここ以降の回答はdir(obj)に相当するものでお願いします。>他の回答者の方

2006/05/24 01:38:35
id:znz No.2

znz回答回数193ベストアンサー獲得回数252006/05/24 02:23:51

ポイント20pt

JavaScriptではfor in ループを使えば列挙できます。

http://starry.night.nu/web/prog/javascript/c01_know_basic_behavi...


Perlの場合は

http://tokuhirom.dnsalias.org/~tokuhirom/tokulog/2149.html

no strict 'refs';
warn Dumper(keys %{"DateTime::"});

のようにパッケージのシンボルテーブルを参照するとそれっぽいことが出来るようです。

http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html#Symbol_Table...

id:westfish

この方法ではパッケージ名を文字列として与えていますから、実用的目的には与えられたオブジェクトからパッケージ名を文字列として取得する方法が必要ではないですか?

2006/05/24 03:15:56
id:znz No.3

znz回答回数193ベストアンサー獲得回数252006/05/25 02:21:39

ポイント30pt

blessされたオブジェクトかどうかのチェックはしていないですが、refと組み合わせてこのような感じでどうでしょうか?

#!/usr/bin/perl
use strict;
sub pythonic_dir {
    my $obj = shift;
    my $ref = ref $obj;
    no strict "refs";
    keys %{"${ref}::"};
}
use Data::Dumper;
use Jcode;
print Dumper(pythonic_dir(Jcode->new("")));
use Digest::MD5;
print Dumper(pythonic_dir(Digest::MD5->new));
id:westfish

なるほど、これで行けそうです。行頭につく$VARの必要性がいまいちわからなかったのでそれは取り除いてみました。

#!/usr/bin/perl

use strict;

use Data::Dumper;

sub pythonic_dir {

 my $obj = shift;

 my $ref = ref $obj;

 no strict "refs";

 my $dump = Dumper(keys %{"${ref}::"});

 $dump =~s/\$VAR\d+ = //ig;

 $dump =~s/;\n/, /ig;

 return $dump;

}

use Digest::MD5;

print pythonic_dir(Digest::MD5->new);

2006/05/25 12:47:38
  • id:ishideo
    Python に影響を受けて作られた JavaScript ライブラリー Mochikit の実例プログラムを使うのはどうでしょう?

    MochiKitを利用した,JavaScriptのインタプリタ「JavaScript Interactive Interpreter」
    http://mochikit.com/examples/interpreter/

    interpreter.js を見ると dir()関数とinspect()関数が使えます。
    出力結果を表示するためには writeln()関数を使う必要があります。
    http://mochikit.com/examples/view-source/view-source.html#interpreter/interpreter.js
  • id:ishideo
    Firebug や Firebug Lite の コンソール関数 console.dir() を使っても同様のことができます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません