コマンド引数

Perlでは、コマンド引数が@ARGVという変数に入ります。

#!/usr/bin/perl

# 引数の配列
print "\@ARGV:";
print @ARGV;

# 配列の最大インデックス数値(配列数-1)
print "\n$#ARGV:";
print $#ARGV;

# 最初の引数
print "\n$ARGV[0]:";
print $ARGV[0];

# 最後の引数
print "\n$ARGV[$#ARGV]:";
print $ARGV[$#ARGV];
print "\n";

実行結果は次のようになります。引数を指定しなかった場合と、引数に「hello perl program」を指定した場合を例に挙げています。

$ ./argv.pl 
@ARGV:
-1:-1
:
:

$ ./argv.pl hello perl program
@ARGV:helloperlprogram
2:2
hello:hello
program:program

ChaSenとRubyをMac OS へインストール

いきおいで、ChaSenとRubyをMac OS へインストール。RubyからChaSenが使えるようになりました。いまどきだと、ChaSenより、MeCabの方を使う人が多いような気もしますが、その場合は、JRuby + Sen という選択肢があるはず(普通は Ruby + MeCab を選ぶでしょうが)。書籍では、Windows + Ruby + ChaSen の組み合わせの方がよく紹介されているような気がするのですが、気のせいでしょうか。

面倒なので下記の環境へ全部インストール
・アプリケーション: /Users/sssg/application/
・ソースコード:/Users/sssg/workspace/src/

http://www.chasen.org/~taku/software/darts/ からDartsの最新版をダウンロードして、インストール。

cd darts-0.32/
./configure --prefix=/Users/sssg/application/darts
make
make install

http://chasen-legacy.sourceforge.jp/ から、ソースコードをダウンロードしてコンパイル。参考にしたページでは、どこでも iconvとdartsを入れておくと楽、と書いてあったので、きっとそうなのだろう。

cd chasen-2.4.4
./configure --prefix=/Users/sssg/application/chasen \
  --with-darts=/Users/sssg/application/darts/include
chmod +x tests/*.sh
make && make check
make install

あとで使うので、先にtoUtf8.shというスクリプトを紹介しておきます。EUC-JPのファイルをUTF-8へ変換するスクリプトです。Mac OS へは iconv を入れてあったので、それを使うようにしています。dicファイルやchaファイルを変換する必要があるので、そのときに使います。

#!/bin/sh
for suffix in cha dic
do
  for f in `ls *.$suffix`
  do
    if [ -f $f ]; then
      echo $f
      iconv -f euc-jp -t utf-8 $f > tmpfile
      mv tmpfile $f
    fi
  done
done
exit

http://sourceforge.jp/projects/ipadic/ からIPA辞書をダウンロード。さきほどのtoUtf8.shを作成して、辞書ファイルなどをUTF-8へ変換しています。

mv ipadic-2.7.0 ipadic-2.7.0-utf8
cd ipadic-2.7.0-utf8/
./configure --prefix=/Users/sssg/application/ipadic
vi toUtf8.sh
chmod 755 toUtf8.sh 
./toUtf8.sh 
`/Users/sssg/application/chasen/bin/chasen-config --mkchadic`/makemat -i w
`/Users/sssg/application/chasen/bin/chasen-config --mkchadic`/makeda -i w chadic *.dic
mkdir /Users/sssg/application/chasen/etc
make install
iconv -f euc-jp -t utf-8 /Users/sssg/application/chasen/etc/chasenrc > \
  /Users/sssg/application/chasen/etc/chasenrc.utf8
mv  /Users/sssg/application/chasen/etc/chasenrc.utf8  \
  /Users/sssg/application/chasen/etc/chasenrc
echo "文字コード変更のテスト。" | /Users/sssg/application/chasen/bin/chasen -i w 

実行結果は次の通り。

文字 モジ 文字 名詞-一般
コード コード コード 名詞-一般
変更 ヘンコウ 変更 名詞-サ変接続
の ノ の 助詞-連体化
テスト テスト テスト 名詞-サ変接続
。 。 。 記号-句点
EOS

http://www.ruby-lang.org/ja/downloads/ からRubyをダウンロードしてインストール。当初は付属のものを使うつもりだったが、Ruby/ChaSenとかが、変なふうにインストールされたら面倒なので、とにかく簡単に戻せるように別途インストールした。

cd ruby-1.8.7-p249
./configure --prefix=/Users/sssg/application/ruby-1.8.7
make
make install
/Users/sssg/application/ruby-1.8.7/bin/ruby  -version

http://raa.ruby-lang.org/project/ruby-chasen から、Ruby/ChaSenをダウンロード。ChaSenと間違えないように、展開したディレクトリ名は変更。

mv chasen1.7 ruby-chasen-1.7
cd ruby-chasen-1.7/
/Users/sssg/application/ruby-1.8.7/bin/ruby extconf.rb \
   --with-chasen-dir=/Users/sssg/application/chasen
make
make install

テストプログラムの作成と実行

cd ~/Desktop
vi test.rb
chmod 755 test.rb 
./test.rb 

テストプログラム test.rb の内容は次の通り

#!/Users/sssg/application/ruby-1.8.7/bin/ruby
# -*- coding: utf-8 -*-

require "chasen.o"
#Chasen.getopt("-F", ‘(%BB %m %M)\n’, "-j")
Chasen.getopt("-F", ‘(%BB %m %M)\n’, "-i", "w")
puts Chasen.sparse("こんにちは。")
puts Chasen.sparse("今日はいい天気です。こんにちは。")

実行結果は次の通り。

(感動詞 こんにちは こんにちは)
(句点 。 。)
EOS
(副詞可能 今日 今日)
(係助詞 は は)
(自立 いい いい)
(一般 天気 天気)
(助動詞 です です)
(句点 。 。)
(感動詞 こんにちは こんにちは)
(句点 。 。)
EOS

関連書籍


関連リンク

com.sun.net.httpserver.HttpServer

Java SE 6 から、com.sun.net.httpserver.HttpServer という簡易Webサーバが内蔵されているということなので、それを使ってみる簡単なプログラムを作成してみました。Jettyを使うまでもないときに重宝しそうです。

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Httpd {
  final static private int PORT = 8081;
  private String message = "Hello com.sun.net.httpserver.HttpServer.";
  private HttpServer server;
  private HttpHandler handler;
  public Httpd() {
    handler = new HttpHandler() {
      public void handle(HttpExchange he) throws IOException {
        System.out.print(new java.util.Date());
        OutputStream os = null;
        try {
          os = he.getResponseBody();
          he.sendResponseHeaders(200, 0);
          os.write(message.getBytes());
        } finally {
          if (os != null) os.close();
        }
        System.out.println("\t" + message);
      }
    };
  }
  public void run() {
    try {
      server = HttpServer.create(new InetSocketAddress(PORT), 0);
    } catch (IOException e) {
      e.printStackTrace();
    }
    server.createContext("/", handler);
    server.start();
  }
  public static void main(String[] args) {
    try {
      Httpd httpd = new Httpd();
      httpd.run();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

ブラウザで http://localhost:8081/ へアクセスすると、下記のような実行結果になります。

>java Httpd
Sat Apr 03 15:03:09 JST 2010    Hello com.sun.net.httpserver.HttpServer.

ブラウザには下記メッセージが表示されます。
Hello com.sun.net.httpserver.HttpServer.

Perl配列

Perlの配列変数は、@で始まります。添字は0から始まります。

$ cat array.pl
#!/usr/bin/perl
@a = ( ‘Perl’, ‘Java’ ); 
$a[2] = ‘Ruby’;
@a[3..4] = ( ‘Python’, ‘C’ );
print "\@a:";
print @a;
print "\n\$a[0]:";
print $a[0];
print "\n\@a[0..2]:";
print @a[0..2];
print "\n";

実行結果は次の通り

$ ./array.pl 
@a:PerlJavaRubyPythonC
$a[0]:Perl
@a[0..2]:PerlJavaRuby

perlの$_

下記のread_stdio_x.plとread_stdio_d.plは同じ動作をします。最初のプログラムでは変数xを使っていますが、これを省略することができます。省略した場合は、「x」の代わりに「$_」という変数が使われます。

$ cat read_stdio_x.pl 
#!/usr/bin/perl
while ($x = <STDIN>) {
  print $x;
}
$ cat read_stdio_d.pl 
#!/usr/bin/perl
while (<STDIN>) {
  print;
}

$ chmod 755 read_stdio_*.pl 
$ ./read_stdio_x.pl
abc
abc
^C
$ ./read_stdio_d.pl 
def
def
^C

プログラムを停止するには、キーボードで[Ctrl]と[C]を同時に押します(画面上の^Cは、その意味です)。