Perlの補完機能付きインタラクティブモード perlsh

前回の記事の続き。

今回はperl。

探してみると、やっぱり対話型インターフェイスを作ってる方がいますね。
メソッド名などの補完も行ってくれるものとして、perlshがありました。
perlshは、Term::ReadLine::Gnuライブラリに付属してます。

Term::ReadLine::Gnuのインストールには、cpanを使うと便利です。
普通にyum install perlとかしとけば、cpanコマンドも付いてくるっぽい。

ただ、私のCentOS 5.1だと、cpan経由のライブラリダウンロードURL (urllist)の
設定がされてなかったので、下記リンク先を参考にしてurllistを設定しました。
http://www.drk7.jp/MT/archives/000885.html

そして、Term::ReadLine::Gnuライブラリをインストールするわけなんですが、
事前にreadlineライブラリ等をyumなどを使ってインストールしとかないと、うまくインストールできないらしいですhttp://www.hasta-pronto.org/archives/2006/08/20-0408.php参照
私の環境では、すでにインストール済みだったので、特に問題ありませんでした。

Term::ReadLine::Gnuライブラリのインストールからperlshを使うまでの流れは以下、

$ cpan install Term::ReadLine::Gnu
$ perl ~/.cpan/build/Term-ReadLine-Gnu-1.17/eg/perlsh
main[1]$ use utf8
main[2]$ utf8:: [TAB]
utf8::             downgrade          is_utf8            unimport
AUTOLOAD           encode             native_to_unicode  upgrade
decode             import             unicode_to_native  valid
main[2]$ exit   #終了

perlshファイルは、実行パスの通ってるディレクトリに入れておくと起動が楽です。

PythonのインタラクティブモードでTab補完を使う

昨日の記事の続き

このまま、各言語のインタラクティブモードの補完機能について書いてけば、
しばらくネタに困らないので続けよう。

今回はPythonです。

pythonの場合、引数なしで起動すればインタラクティブモードになりますが、
下記のようにrlcompleterをimportすることで、補完機能が使えます。
ただし、readlineライブラリが必要です。Linuxとかなら、yum install pythonで普通に入るようです。
[Python]
$ python
>>> import rlcompleter
>>> rlcompleter.readline.parse_and_bind(‘tab: complete’)
>>> di [TAB]
dict dir divmod
>>> di
[/Python]

Windowsの人は、Python Alternative Readlineをインストールするのが楽だと思います。

若干、通常のreadlineと挙動が違うのがアレですが・・・。

参考サイト

Interactive ShellによるPHP対話入力補完

この前の記事の続き。

rubyには、irbっていうinteractive modeあります。
irb実行中に、 require ‘irb/completion’ すると、TABでメソッド名等の補完ができるようになって大変便利です。

PHPのinteractive modeでも同じことができないかなと思い、
探してみたところ、PHP5.1 から標準で導入されてることがわかりました補完機能付きのinteractive modeは、Interactive Shellっていう名称が付いてます。

ただし、–with-readline付きでPHPをコンパイルした場合に限ります。なんで、readlineを動的リンクするだけで使えるようにしてないんだー

yumでインストールしたPHPは、–with-readlineが付いてないので、少なくとも、CentOS 5.1のyumでインストールしたPHPは–with-readlineはついてませんでした。
PHP-cliだけソースコードからもう一度コンパイルしてみました。

環境は、CentOS 5.1です。

$ wget http://jp2.php.net/get/php-5.2.6.tar.gz/from/jp.php.net/mirror
$ tar xzvf php-5.2.6.tar.gz
$ cd php-5.2.6/
$ yum install libxml2-devel
$ yum install readline-devel
$ ./configure --prefix=~/local --disable-cgi --with-readline
$ make
$ make install
$ ~/local/bin/php -a
Interactive shell

php > get_class  [TAB]
get_class          get_class_methods  get_class_vars
php > get_class

うむ、便利だ。

PHPインタラクティブモードの便利な使い方

ブログに書くネタは結構あるんだけど、整理してから書こうとするとなかなか書けない・・・。

しょうがないんで、ネタは小出しに書くことにしよう。

PHPで何かのライブラリのオブジェクトを使う際、どんなメソッドがあるのかよくわからにことが多々あります。リファレンスを見りゃいいんですが、それが面倒な時は、PHP (CLI)のインタラクティブモードを使うと便利です。

インタラクティブモードの場合、statementが完成するたびに(セミコロンで区切られるたびに)処理が実行されるようです。

[PHP]
$ php -a

close
[1] => getAttribute

[24] => expand
)
(Windowsだと Ctrl-Zで終了)

$
[/PHP]

インタラクティブモードで、よく利用する関数は以下 (全部、リフレクション系関数)、

  • get_class_methods( mixed $class_name )  [クラスのメソッドを配列として返す]
  • get_object_vars ( object $object ) [オブジェクトのプロパティを配列として返す]
  • get_declared_classes(void) [定義済のクラスの名前を配列として返す]
  • get_defined_functions(void) [定義済の関数の名前を配列として返す]
  • get_defined_vars(void) [定義済の変数の名前を配列として返す]
  • get_loaded_extensions(void) [コンパイル/ロードされている全てのモジュールの名前を配列として返す]
  • get_extension_funcs ( string $module_name ) [あるモジュールの関数名を配列として返す]