Walrus,Digit. | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示 編集 | 編集(管理者用) | 差分

PerlCETest

編集

PerlCEの試験結果。

この試験は、GENIO e550X (PocketPC2002 + Strong Arm 200MHz)上で行っています。 画面写真も同機種のものです。


Same page in (very poor) English is here.

about PerlCE

編集

PerlCEは、General Paranoyaxcというページで公開されているWindows CE用のPerlです。

Hello, world!

単純なプリント文によるHello, world!は動作しました。 しかし、日本語の表示は文字化けしますし、そもそも日本語交じりのスクリプトが実行できない(スクリプトにSyntax errorが出てしまう)ケースもありました。

Hello, world!

PerlIDE上で、以下の古典的な試験スクリプトを作成します。

   print "Hello, World!\n";

[File]-[Save]でファイル名をつけて保存後、[Perl]-[Run]をタップすると、スクリプトが実行されます。 私の環境では、無事「Hello, World!」を見ることができました。

なお、PerlIDE上での実行では、スクリプトが終了するとすぐに結果表示が消えてしまいます。 PerlIDE下部右から2番目、緑の矢印付きのアイコンをクリックして、最後のSTDOUTへの出力を見ることもできますが、PerlCEのドキュメント(PerlCEDocument)では次のスクリプトのように<STDIN>を入れることを勧めています。

   $| = 1;
   print "Hello, World!\n";
   <STDIN>;

こうすると右図のように、出力後にENTERを押すまで、STDOUT画面が消えません。


ハロー、世界のみんな!

次はこちら。 日本語を表示してみます。

   print "ハロー、世界のみんな!\n";
  • PerlIDEの実行結果画面では、「□n□□□[!」のような良く分からない表示になります。
  • 標準出力画面(PerlIDEの左から4番目のアイコンをクリック)では、正しく「ハロー、世界のみんな!」と出力されています。
  • \perl-stdout.txt (PerlCEはこのファイルを必ず作成します)には正しく「ハロー、世界のみんな!」と出力されています。

PerlIDEでは編集画面のフォントを切り替えられるのですが、実行画面のフォントは切り替わらないようです。

ポイント

  • 標準出力は\perl-stdout.txtに出力されます。
  • PerlIDEでの実行時は、標準出力を見ることができます。
    • 日本語(SJIS)の表示は化けますが、\perl-stdout.txtには正しく出力されています。
    • <STDIN>;を最後に入れないと、表示後すぐにウィンドウが閉じてしまいます。
    • $|=1;を最初に入れないと、表示が去れない(メモリ内のバッファで済んでしまう)ことがあります。

HTTPクライアント

ドキュメント(PerlCEDocument参照)によれば、Socket.pmを使うことができるとなっています。 とはいえ、Windows CE環境では、メールクライアントにはQMail、FTPクライアントにはCeder FTP、NewsクライアントにはKAWARAといった良いソフトがあります。 ここでは、Socketモジュールを使ったHTTPクライアントを作成し、実行します。

なお、HTTPクライアントのプログラミングについては解説しません。 インターネット上にはすでに良いスクリプトが多くありますし、自作したいのであれば「WebクライアントプログラミングWithPerl」などの書籍があります。

Socket.pmの導入

Socketモジュールを始め、いくつかのモジュールをWindows用のActivePerl環境からもらいます。 必要なファイルは次のとおりです。

  • Carp.pm
  • Exporter.pm
  • Socket.pm
  • warnings
  • warnings/register.pm

これらのファイルは、Perlをインストールしたディレクトリのすぐ下、libディレクトリ内にあります。 ActivePerlのインストール先がC:\Perlの時は、C:\Perl\lib\になります。

ファイルが見つかったら、Active Sync等でPocketPC機にコピーし、Perlをインストールしたディレクトリのすぐ下、libディレクトリに移してください。 PerlCEInstallの私のディレクトリ構成に合わせている場合、「\UnixRoot?\Usr\Perl\lib」です。

次の「簡単なHTTPクライアント」ではjcode.pl(日本語の扱い?参照)を使用します。 このファイルも、同じlibディレクトリにコピーしておいてください。

簡単なHTTPクライアント (from とほほのWWW入門)

とほほのWWW入門」のPerl→Socketの項に簡単なHTTPクライアントが載っています。 これを使って、Yahoo!のトップページを取得してみます。 上のスクリプトに少し変更を加え、次のようなスクリプトにします。

   require "jcode.pl";
   $host = "www.yahoo.co.jp";
   $page = "/";
   $data = "";
   $addr = (gethostbyname($host))[4];
   $name = pack("S n a4 x8", 2, 80, $addr);
   socket(S, 2, 1, 0);
   connect(S, $name);
   binmode(S);
   select(S);
   $| = 1;
   select(stdout);
   print S "GET $page HTTP/1.0\r\n\r\n";
   while (<S>) { $data .= $_; }
   close(S);
   jcode::convert(\$data, 'sjis', 'euc');
   print $data;

ダイアルアップ環境(Air H"など)の場合は、あらかじめダイアルアップ接続をしておいてください。 これを実行すると、右図のようにトップページのHTMLデータを取得でき、日本語も正しく表示されます。

とほほのWWW入門」のスクリプトをそのまま実行すると、Yahoo!JapanのページがEUCで記述されているため、日本語部分は表示が化けてしまいます。 そこで一度、データを$dataに入れ、文字コード決め打ちでeucからsjisへの変換をしています。 なお、「ハロー!」と同様に実行時の画面では文字化けしますが、標準出力では正しく表示されています。


ポイント

  • Pure Perlの標準モジュールは、他のPerl系から持ってきたものがそのままPerlCEでも動作します。
  • Socketなど、いくつかのPure Perlではない標準モジュールも、XSファイルが提供されていれば動作します。PerlCEDocument参照。
    • 標準モジュールは、ActivePerl build 623のものを使うのが確実です。PerlCEはPerl5.6.0ベースですので、5.6.1ベースの最新Buildに同梱のものでは、Config.pmなどで問題が起きます。
  • jcode.plなど、Pure Perlのライブラリは標準のもの以外でも動作するものがあります。
    • Pure Perlのライブラリでも、他のライブラリをrequire/useしていて、そのライブラリがPerlCEで動作しないようであれば、やはり動作しません。
  • 日本語出力時はjcode.plでsjisに変換することをお勧めします。Wincows CE上ではEUCのデータを表示するのは(PWZ Editorなどを使わない限り)厄介です。

その他

その他、PerlCEについて気づいたこと、考えていることなどを箇条書きで。

ライブラリ

ほとんどモジュールはついていないので、Perl5らしいプログラミングになれていると、戸惑うかも知れません。 実際には、次のようなことをしなくちゃいけないな、と考えています。

  • Data::Dumper等、xsファイルが導入済みのモジュールを導入
    • 上にある通り、Socketはちゃんと動作しました。
  • libwww-perlや、cgi-libといった、単体完結のライブラリの動作確認
  • Win32::OLEの動作確認

このページへのご意見、ご質問

(ここにお書きください。)

一行コメント

  • 2002-05-14 (Tue) 18:35:10 塚本牧生 "ハロー、世界のみんな!"は問題なく動きました。前回は何か打ち間違えてたのかな...。
  • 2002-08-02 (Fri) 11:30:32 Takachin : 今結城さんのPerlプログラミングレッスンという本でPerlを学んでるのですが、そのサンプルがOsError?などというエラーを出すので動かなくて困ってます。うーん。
  • 2002-08-02 (Fri) 11:34:11 Takachin : ちなみにエラーが出るプログラムはhttp://www.hyuki.com/pb/のzip版に同梱されているSample\chap05\makehtml.plです。
  • 2002-08-04 (Sun) 11:26:02 塚本牧生 : 試してみたところ、Perl IDEから実行する場合、日本語のコメント分を削ると動作しました。w32consoleからだと、まったくそのままで動作。...というか、Os Errorが出るケースって、変換するテキストファイルを指定しなかった場合ではないですか?
  • 2002-08-10 (Sat) 21:36:12 Takachin : そうか...PerlIDEが日本語対応していないことを忘れていました。テキストのパスは指定しておいてます。ありがとうございました。
  • 2002-09-08 (Sun) 01:05:22 Telion : "exit 99;" などと終了すれば、私の環境ではPerlコンソールが残ってくれます。
  • 2002-09-08 (Sun) 03:11:12 Telion : 他のページも拝見させていただきましたが、塚本さんのサイトは、情報が大変わかりやすい形でまとめられていて助かります。
  • 2002-09-08 (Sun) 13:42:13 塚本牧生 : "exit 99;"って、もしかしてエラー扱いでしょうか。それとも99が特殊?時間が出来たら試してみなくちゃ。
  • 2002-09-08 (Sun) 14:16:27 Telion : そうです。終了コードが0以外?だと、小さなメッセージダイアログが出てきて、確認を求めます。INPUTを使った方が良い面もあるかもしれないのですが、スクリプトのあちこちにExit文がある時は、それに終了コードを付けとく事で、どこから抜けてきたのか分かるので便利です。
  • 2002-09-18 (Wed) 03:51:13 大久保? : はじめまして。塚本さんのサイトの情報を利用させていただいて,拙作のスクリプトを PerlCE 上で動作させるためのインストールメモを作りました。そのスクリプトは携帯電話へのメール分割転送を行う ubiqun.pl というもので,Net::SMTP,Net::POP3 などを呼び出しています (Net モジュール自体はスクリプトと同梱)。もしよかったら参考にしてみてください。http://mah.pobox.ne.jp/ubiqun_windowsce.shtml
  • 2002-09-18 (Wed) 23:09:12 塚本牧生 : お知らせ、ありがとうございます。正直、ubiqun自体はモバイル機向けとは思えなかったのですが、メール系のモジュールの使用方法が確立されたのは非常に大きいですね!ここらへんをざっとまとめて、Rainer Keuchel氏にメールしてあげると、きっと喜ばれますよ?
  • 2005-05-30 (Mon) 16:37:02 Mt.Trail? : PerlIDEで日本語がちゃんと表示されました。環境はiPAQ(hx4700) + celib-3.13 + Perlide-wince-arm-pocket-wce300.tarです。
  • 2005-05-30 (Mon) 16:49:00 Mt.Trail? : 勘違いでした。標準出力のほうを見てました。 この2行、ゴミですね。ごめんなさい。
  • 2005-08-26 (Fri) 14:45:58 QUEBits? : はじめまして。コードに日本語を使うと、たとえば、「print "はじめまして。日本のみなさん。\n";」みたいなコードでも、「Can't find string terminator '"' anywhere before EOF at ~」とエラーがでるけど、適当な長さのコメントをコードにの最後に付けると正しく出力されるのは偶然ですか?でも、この方法で、日本語を使った場合の他のエラーも避けられます。
[[#comment]]