Perl初心者の部屋  序章  1章  2章  3章  4章  5章  6章  7章  8章  10章
PageID:New Perl-FAQ9J
Last updated:97.07.24

Perl for Win32 Frequently Asked Questions (FAQ)


翻訳者: 木村 浩一さん <kkimura@pure.cpdc.canon.co.jp>

9. モジュール/サンプルスクリプト

9.1. 私のperl5/Libディレクトリのスクリプト/モジュールの多くが動きません。 どうしてでしょうか?

これらのモジュールはあるがまま(AS-IS)の状態で配布されていて、 必ず動作するという保証もありません。 こういったモジュールが動作しない理由は幾つかあります。

そういったモジュールを自分で修正しようとすることも、すでに誰かが なおしたかどうかを確認することもできます。 質問 5.8 を参照してください。

9.2. CPANから取ってきた私のperl5/Libディレクトリのスクリプト/モジュールの 多くが動きません。どうしてでしょうか?

See 質問 9.1. However, if you make a change to a CPAN module that makes it work on Perl for Win32, you have a better chance of getting the author to change the module than you do of getting a change in the standard library.

CPANにあるモジュールの多くがビルドとインストールのために Makemakerというユーティリティを使っていることに注意してください。 MakeMakerはPerl for Win32に移植されていませんから、あなたは通常は モジュールファイルをライブラリディレクトリにコピーするという作業を 手作業で行わなければなりません。サブディレクトリ構造を保持することを 忘れないようにしてください。

9.3. 私のPerlスクリプトからデータベースにアクセスするには どうしたらいいのでしょうか?

Perl for Win32からデータベースにアクセスするために開発されたエクステン ションが幾つかあります。Win32::ODBCは広く知られていて、CPANや 以下に示すURLから入手できます。

http://www.roth.net/odbc/

別のモジュール、ODBCTableはODBCのテーブルとperlのハッシュとを結び付け、 テーブルをハッシュと全く同じように使えるようにします。これは 以下に示すURLで入手できます。

http://www.endcontsw.com/sampledownload.htm

どちらを使うかはあなたのお好みしだいです。どちらのモジュールを 使うにしろ、ODBC(Open DataBase Connectivity)のドライバがなければ ならないということに注意してください。 ODBCに関するより詳しい情報や、データベースの構築の方法は コントロールパネルにあるODBCアプレットをチェックしてください。

Microsoft Accessや Microsoft SQL serverのような一部のデータベース システムでは、OLEオートメーション (質問 9.4を参照) を通じて制御することもできます。 詳細は製品のマニュアルを参照してください。

9.4. 私のPerlスクリプトからOLE オートメーションを使う方法はあるのでしょうか?

あります。Perl for Win32のドキュメントにあるoleautoのページを みればすべてが載っています。 あなたがperlをインストールしたディレクトリのegというサブディレクトリ には、Perl for Win32を使って Microsoft Excelにアクセスする例が二つあります。

これはOLEオートメーションのみであって、埋め込みドキュメント(embed document) やドラッグアンドドロップのようなものを提供する他のOLEの機能を 使うことはできないことに注意してください。また、OLEコードの バグのためにDLLとして実装されているOLEサーバー (これらはCLSCTX_SERVERではなくCLSCTX_LOCAL_SERVERを使って CoCreateInitializeを実行している)を使うことが できないということにも注意してください。

これはOLEコントロール(OCX)やデータアクセスオブジェクトライブラリを 使えない、ということです。配布されているソースコードを入手して 上で述べたことがら(ntole.cppの321行目)を修正することもできるでしょう が、それはテストされていないことですから、やる場合にはあなた自身の 責任において行ってください。

9.5. 私のPerlスクリプトからData Access Objects (DAO)にアクセスする方法は あるのでしょうか

あるともいえますし、ないともいえます。 質問 9.4を参照して ください。

9.6. 私のPerlスクリプトからMAPIにアクセスする方法はあるのでしょうか?

現在のところ、Perlスクリプトから直接MAPIにアクセスする方法は ありません。単純なMAPIエクステンションのためのPerlエクステンションが 作業中です。

[これって本当? どこかにMAPIエクステンションがあったりしない? -ESP]

OLEオートメーションを使ってメイルプログラムを制御することが できるかもしれません(質問 9.4を参照)。 Microsoft ExchangeはOLE オートメーションが使えるとのことです。

9.7. 私のPerlスクリプトからSMTP (インターネット)メールを送信するには どうしたらいいのでしょうか?

今のところお薦めの方法は、Windows NT リソースキットにある BLATと呼ばれるプログラムを使うことです。これはファイルを 受取人(recipent)に送るコマンドラインプログラムです。 質問 4.7を参照

ソケットを使ってメイルを送るperlスクリプトも幾つかあります。 幾つかの例はRobin ChatterjeeのWebページにあります (質問 3.4を参照)。

9.8. Perl for Win32向けに利用できるDBM の実装はあるのでしょうか?

はい、あります。SDBM_FileはDBMのフリーなクローンであり、 Perl for Win32に実装されています。そして、Perl for Win32 の配布パッケージと一緒に配布されています。あなたはこれを 以下のようにして使うことができます。

    use SDBM_File;
    # use Fcntl; #これはだめ! 質問 9.15参照

    sub O_CREAT { 0x0100 }
    sub O_BINARY { 0x8000 }
    sub O_RDWR { 0x0002 }

    tie( %myhash, "SDBM_File", 'myfile', O_RDWR | O_CREAT | O_BINARY,
      0666 )
      or die( "Can't tie: $!" );

    $myhash{"bibim"} = "bap";

    untie( %myhash );

マイクロソフトによって定義されている proprietary flagである O_BINARYフラグを使わなければならないことに注意して下さい。 DBMファイルは“バイナリ”であり、UNIXとWin32ではその意味するところが 大きく異なります。

DBMファイルを結び付け(tie)てしまえば、後はハッシュテーブルと 同じように使うことができます。

9.9. Perl for Win32向けに利用できるGDBM の実装はあるのでしょうか?

いいえ、ありません。s/GDBM/SDBM/gとして、GDBMを使っているところを SDBMを使うようにスクリプトを変更することはできますが、 DBMファイルとGDBMファイルとでは互換性がありません。このため あなたは変換の類のことをやらなければならないでしょう。

9.10. Perl for Win32でGUI プログラミングをする方法はあるのでしょうか?

まだありません。 TKライブラリがWin32環境に移植されてはいますが、私たちはここで PerlTKの移植を期待したほうが良いでしょう。もしあなたがそれを 必要としているのなら、あなた自身が移植するのが良いかもしれません。 これに関する情報は、CPANにあるPerl/Tkの配布パッケージで得ることが できるでしょう。

一部のPerlプログラマーに対するもう一つの選択肢は、 Visual Basicに対する GUIのフロントエンドを開発して、OLEオートメーション を使ってそれを制御するというものです。

9.11. Win32用oraperlのポート(移植)はあるのでしょうか?

現時点ではありません。けれども、ODBCモジュールのどれかを使って Oracleデータベースに接続することができます。 詳しくは質問 8.3 を 参照してください。

9.12. Perl for Win32の配布セットにはどんなモジュールが付いてくるのでしょうか?

標準ライブラリファイルと一緒に、Win32特有のモジュールが幾つか Perl for Win32と共に配布されています。

これらは Win32modというドキュメントで説明されています。また、 Win32パッケージのためのsubs builtがあります。

[Can anyone straighten me out on some of these? -ESP]

perlに対するWin32エクステンションに関するより詳しい情報は Philippe LeBerreのページ (http://www.inforoute.cgs.fr/leberre1/) で見つけられます。

9.13. Perl for Win32向けの他のモジュールはどこで見つけられるでしょうか?

Perl for Win32用のモジュールはCPAN(Comprehensive Perl Archive Network) という世界中にミラーリングされてるperlのアーカイブで見つけられます。 あなたの身近にあるミラーリングサイトを見つけるには、以下のURLを チェックしてください。

http://www.perl.com/perl/CPAN/modules/by-module/Win32/

( ここをアクセスすると、魔法のように(automagically)一番近いミラーリングサイト へ連れてってくれるんだ。すごいよね、そうだろ?)

幾つかのモジュールがActiveWareのftpサーバーにありますが、これらは ほとんど保守されていません。

ftp://ftp.activeware.com/contrib/

9.14. Perl for Win32向けに利用できるGDモジュールはあるのでしょうか?

あります。GDを移植した Win32GDが以下に示すURLから入手できます。

ftp://ftp.activeware.com/contrib/Win32GD_v960527.zip

[誰かこれ使ってる? -ESP]

9.15. どうしてFcntl は動かないのでしょうか?

Fcntlモジュール(ファイルコントロールフラグのためのもの)はPerl for Win32 のバイナリ配布パッケージには含まれていません。ソース配布パッケージを 入手して、自分でFcntlモジュールをビルドする必要があります。

さらに、モジュール手続きを組み立てるFcntl.pllをサポートするための Fcntl.pmがありません。あなたは自分用のFcntl.pmを作る必要が ありますが、これはAutoloaderを使っているので困難なことです。

9.16. どうしてWin32::NetResourceは動かないのでしょうか?

Win32::NetResouceモジュールはPerl for Win32のバイナリ配布パッケージに は含まれていません。ソース配布パッケージを入手して、自分で ビルドする必要があります(質問 1.6参照)。

Win32::NetResourceモジュールは他のすべてのWin32モジュールと共に ビルドされているのではないということに注意してください [多分これは、バイナリ配布に入れるのを忘れたんだろうね... -ESP]。 あなたはプロジェクトを開いて、別個にビルドする必要があります。

9.17. どうしてFile::Find あるいは Cwdは動かないのでしょうか?

[Thanks to Dave Wolfe (dwolfe@risc.sps.mot.com) for this answer. -ESP]

File::Findはディレクトリ構造を再帰的にたどるPerl5のモジュールで、 Perl 4での find.plやfinddepth.plと同じ働きをするものです。これは Perl for Win32環境に既に対応しています。 Cwdが作業ディレクトリを切り替えるのに使われています。

ビルド100と一緒に配布されているFile::Findには 宣言されている変数($dont_use_nlink, $prune, $name, $dir) や呼び出されている他のパッケージとのやりとりで幾つかの問題があります。

File::Findはまたディレクトリ構造のどこにいるのかを決めるために statコマンドの返す値を使っています。これはMS のファイルシステムが ファイルの検査(identify)のためにinodeやリンクというコンセプトを 使っていないので、ディレクトリの“リンクの数”フィールド(nlinks)は 何の意味もありません。最新のFind.pmではConfig.pmのOS名を nlinkを使うかどうかを使うかどうか決めるのに使っています。

結局、File::Findは不完全なCwd.pmに依存しているのです。

ビルド110では、以下の手順に従うことでFi;;:FindとCwdをきちんと動作する ようにできます。

    elsif ($osname eq 'MSWin32') {
        *cwd        = \&_NT_cwd;
        *getcwd     = \&_NT_cwd;
        # BEGIN ADDITION: Cwd.pm, line 250
        *fastcwd    = \&_NT_cwd;
        # END ADDITION
        *fastgetcwd = \&_NT_cwd;
    }

ビルド300以降の Perl for Win32ではFile::FindとCwdに関するエラーは 正しいことに注意してください。

9.18. CPANとは何ですか、それを利用するにはどうすればいいのですか?

CPANとはComprehansive Perl Achive Network(総合的な Perl アーカイブネット ワーク)の略で、あなたがPerl でプログラミングするに当たって欲しくなるよう なファイルがたくさん集められています。オリジナルのアーカイブはフィンランド にありますが、それをミラーリングしているFTPサーバーが世界中にあります。

www.perl.comにある CPANリダイレクターを使って、“最も近い” CPANのミラーサイトに接続できます。

http://www.perl.com/CPAN/

このURLはあなたのブラウザを最も近くにあるCPANミラーサイト へ接続してくれるでしょう(one on your continent and maybe only a few hops away)。

http://www.perl.com/CPAN

このURLでは、多少の情報を提示してCPANミラーサイトをあなた自身に 選択させます。

CPAN は モジュールやスクリプトを探すのと同様に、Perl for Win32の配布 パッケージを探すにもよいところです。詳しくは 質問 9.2を読んでください。

9.19. Microsoft Officeあるいは他のアプリケーションファイルを読み書きする ライブラリはあるのですか?

一般的な話をすると、Microsoft Word, Microsoft Excel, Microsoft Access, WordPerfect, Lotus 1-2-3などといったアプリケーションのファイルを 読んだり書いたりするようなライブラリモジュールはありません。

しかし、現在では主要なWindowsアプリケーションのほとんどがOLEオートメーション をサポートしています。あなたはMicrosoft Officeアプリケーションの OLEオートメーションサポートを使って、アプリケーションのファイルの読み書き をすることができます。あなたが使っているアプリケーションの OLEオートメーションに対するサポートについては、アプリケーションの ドキュメントを参照して下さい。 Perl for Win32でOLEオートメーションを使う方法については 質問 9.4 を参照してください。

特別な例としては、Microsoft Access, FoxPro, dBase, Paradoxといった 多くのデータベースのファイルは、ODBC(Open DataBase Connectivity)を 使ってアクセスすることが可能です。 Perl for Win32でODBCを使う方法の詳細は 質問 9.3 を参照してください。


ご意見、ご要望は、 電子メールまたは 投稿にお願い致します。

ホームページへ戻る。