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

Perl for Win32 Frequently Asked Questions (FAQ)


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

5. 実装の癖

5.1. Perl for Win32上では関数Xは機能していないように思われます。 どうしてでしょうか?

Perl for Win32では実装されていないような関数が幾つかあります。 これはalarm(), fork()のような類のもので、UNIX用に開発された モジュールでは良く使われているものです。これらの関数はPerl for Win32にはありませんから、そういった関数を使っているモジュールを 使うことはできません。

実装されていない関数の、別の種類のものとしては System Vの IPC関数、 UNIXのシステムコール、WinSockではないバークレイ(Berkeley)ソケット関数 などがあります。こういったものを以下の一覧に示します。 これは unsupported.nttから抜き出したもので、 実装されていない関数を検査するperlスクリプトを使っています。

    alarm(), chroot(), fork(), getpgrp(), getppid(), getpriority(),
    getpwnam(), getgrnam(), getpwuid(), getgrgid(), getpwent(),
    getgrent(), setpwent(), setgrent(), endpwent(), endgrent(), kill(),
    link(), msgctl(), msgget(), msgrcv(), msgsnd(), semctl(), semget(),
    semop(), setpgrp(), setpriority(), shmctl(), shmget(), shmread(),
    shmwrite(), symlink(), syscall(), times(), wait(), waitpid(),
    getnetbyname(), getnetbyaddr(), getnetent(), getprotoent(),
    getservent(), sethostent(), setnetent(), setprotoent(), setservent(),
    endhostent(), endnetent(), endprotoent(), endservent(), socketpair()
 

このほかにも多くの関数で、期待とは違った動作をしたり、貧弱な実装しか なされていなかったりします。以下にリストにします (がこれだけではありません)。

[他には? -ESP]

5.2. PerlISの元では関数Yは機能していないように思われます。どうしてでしょうか?

UNIXプログラムの他にも、PerlISには二つの(標準のものに比べて)不利な点が、 Webサーバとのプロセス空間の共有や他のISAPIエクステンションと比較したとき に存在します。このために、PerlISによって実行されるPerlスクリプトには (PerlISができる/できないによる)制限があります。一部のものは組込みで あり、また別の一部のものは“悪いこと”を行っています。

PerlISのインフォページの記述によれば、PerlISを使ってPerlスクリプトを 実行するときにできない/すべきでないことがふたつあります。

5.3. Perl for Win32と標準的な配布キットの間の違いは何でしょうか?

あー、たくさんあります。標準配布キットはUNIX中心の世界で 開発され、保守されています。そして、OSに依存した組込みの機能が たくさんあります。以下にこれらの違いを簡単にリストにしました。

結局のところ、文化の違いというものがあります。 perlはそれを使っている人々によって、開発され保守されています。そして そこにはプロダクトの進歩を協力して行うという性質があります。 反対に Perl for Win32は AcitiveWareに実質的に所有されていますし、 ActiveWareはloose-knit user-developer comutityとしての性質も 持っていなければ、商用ソフトウェアの企業としての反応もありません。

5.4. Windows NT上でPerl for Win32を走らせるのとWindows 95上で走らせるのでは どんな違いが出るのでしょうか?

Perl for Win32は本来Windows 95では動作しませんが、 二つのオペレーティングシステム(NTと95)の間にはわずかな違いが あります。以下に挙げる事柄に注意してください。

[他に違いは? -ESP]

もしあなたがどちらかでしか使えないような機能を使うことを心配して いるのであれば、関数Win32::IsWinNT()の戻り値を使ってどちらのOS上で 動作しているのかをチェックしてください。 質問 9.12も参照してください。

5.5. なんでラクダ本にあるサンプルが私の環境では動かないのでしょうか?

ラクダ本(Programming Perl, Wall他, O'Reilly & Associates 1996)は UNIX人によって、(主に)UNIX人のために書かれました。

ラクダ本にあるサンプルの一部は動き、一部は動きません。 あるサンプルが動かなければ、それはスクリプトで使っている関数か外部ツール が使えなかった。あるいはモジュールが使えなかったということでしょう。 小さいスクリプトであれば、それを正しく動作するようになるまで いじくりまわすこともそう難しくはないでしょう (質問 5.8を参照)。

ラクダ本とリャマ本は良い教材です。けれども、あなたが Perl for Win32 のプログラマーとして学ぶことがらは、UNIXをターゲットとしているスクリプト やモジュールをどのようにPerl for Win32に移植するか、といったこと なのです。

perlのモットーは"There's More Than One Way To Do It" (やり方は一通りじゃない) です。 Perl for Win32のモットーは "It's A Good Thing That There's More Than One Way To Do It, Because Most Of The Ways Don't Work" (やり方が一通りでないのは良いことだ。だって、ほとんどは使えない んだから)といえるでしょう。

5.6. 標準モジュールのZが動かないのはどうしてですか?

標準ライブラリモジュールの多くは、他のperlプログラムが動作しないのと 同じ理由で動作しません。つまり、使っている関数が実装されていないとか。 外部ツールがないとか、依存しているモジュールが使えないとかいった ものです。

perl 5.00xの標準配布パッケージに付属している“標準ライブラリ”モジュール の多くは、perl for Win32と一緒に配布されていません。これは そういったモジュールがperl 5.001mにはないからです。このため そのようなモジュールを使うことは多分できません。

See also 質問 8.2.

5.7. UNIXベースのスクリプトを動くようにするにはどうすればいいのでしょうか?

まず最初に、あなたの使っているプログラム/モジュールが適切なやり方で 使われいるかどうかを良く確認してください。私たちの多くは 自分達のプログラムが正しく動いていなかったときに、 モジュールやオペレーティングシステム、あるいはインタープリターの せいにしがちです。

もし自分の書いたプログラムに問題がないと確信しているのであれば、 UNIXベースのスクリプトを動作させるようにする最善の方法は、それを 実行する前に机上でチェックするということです。いかに示すことがらを 注意してみてください。

Of course, it should go without saying that for everything you take out you'll have to put in a work-around.

スクリプトやモジュールにあるUNIXに依存している部分についての作業を済ませ たら、それをデバッガー経由で実行してみてください。 スクリプトやモジュールに".t"というそれをテストするためのファイルが あれば、あなたが変更したものをテストするのにそれを使ってみてください。

UNIXベースのスクリプトやモジュールに対する変更を行った場合には それを作者に知らせてください。作者達は Perl for Win32でも動作できる ようにする変更を喜ぶこともあるでしょう。作者がプログラムの変更を しないのであれば、あなたが変更したプログラムを再配布してよいのか どうかを作者に訊ねてみてください。

5.8. Win32プラットホームでchmod関数はどのように機能するのですか?

Perl for Win32でもchmod()は期待した通り動作します。ただし、 その結果はあなたが望んだものとは違うかもしれません [誰か、私に何がうまく言って何がだめなのか教えてくれないか? -ESP]。

UNIX形式のファイルセキュリティはWin32システム上のファイルには適用 できません。Win32システムはDOSで使うことのできる四つの“ファイル属性” アーカイブ(A)、リードオンリー(R)、隠し(H)、システム (S) を受け継いでいます。これらはWin32::File::Get/SetAttributes()を 使ってチェックしたリセットしたりすることができます。

Windows NTで使っているNTFSでは、個々のファイルでユーザーや グループに対するより多くの属性を保持できます。ビルド110では、 CALCSというプログラム(詳しくはコマンドラインでHELP CALCSとタイプ してください)を実行することによって、属性を取得したり設定したり できます。ビルド300以降では、Win32::FileSecurityモジュールを使って ファイルの属性を保守できます。


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

ホームページへ戻る。