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]
UNIXプログラムの他にも、PerlISには二つの(標準のものに比べて)不利な点が、
Webサーバとのプロセス空間の共有や他のISAPIエクステンションと比較したとき
に存在します。このために、PerlISによって実行されるPerlスクリプトには
(PerlISができる/できないによる)制限があります。一部のものは組込みで
あり、また別の一部のものは“悪いこと”を行っています。
PerlISのインフォページの記述によれば、PerlISを使ってPerlスクリプトを
実行するときにできない/すべきでないことがふたつあります。
あー、たくさんあります。標準配布キットはUNIX中心の世界で
開発され、保守されています。そして、OSに依存した組込みの機能が
たくさんあります。以下にこれらの違いを簡単にリストにしました。
結局のところ、文化の違いというものがあります。
perlはそれを使っている人々によって、開発され保守されています。そして
そこにはプロダクトの進歩を協力して行うという性質があります。
反対に Perl for Win32は AcitiveWareに実質的に所有されていますし、
ActiveWareはloose-knit user-developer comutityとしての性質も
持っていなければ、商用ソフトウェアの企業としての反応もありません。
Perl for Win32は本来Windows 95では動作しませんが、
二つのオペレーティングシステム(NTと95)の間にはわずかな違いが
あります。以下に挙げる事柄に注意してください。
[他に違いは? -ESP]
もしあなたがどちらかでしか使えないような機能を使うことを心配して
いるのであれば、関数Win32::IsWinNT()の戻り値を使ってどちらのOS上で
動作しているのかをチェックしてください。
質問 9.12も参照してください。
ラクダ本(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"
(やり方が一通りでないのは良いことだ。だって、ほとんどは使えない
んだから)といえるでしょう。
標準ライブラリモジュールの多くは、他のperlプログラムが動作しないのと
同じ理由で動作しません。つまり、使っている関数が実装されていないとか。
外部ツールがないとか、依存しているモジュールが使えないとかいった
ものです。
perl 5.00xの標準配布パッケージに付属している“標準ライブラリ”モジュール
の多くは、perl for Win32と一緒に配布されていません。これは
そういったモジュールがperl 5.001mにはないからです。このため
そのようなモジュールを使うことは多分できません。
See also 質問 8.2.
まず最初に、あなたの使っているプログラム/モジュールが適切なやり方で
使われいるかどうかを良く確認してください。私たちの多くは
自分達のプログラムが正しく動いていなかったときに、
モジュールやオペレーティングシステム、あるいはインタープリターの
せいにしがちです。
もし自分の書いたプログラムに問題がないと確信しているのであれば、
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でも動作できる
ようにする変更を喜ぶこともあるでしょう。作者がプログラムの変更を
しないのであれば、あなたが変更したプログラムを再配布してよいのか
どうかを作者に訊ねてみてください。
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モジュールを使って
ファイルの属性を保守できます。
ホームページへ戻る。
5.2. PerlISの元では関数Yは機能していないように思われます。どうしてでしょうか?
5.3. Perl for Win32と標準的な配布キットの間の違いは何でしょうか?
5.4. Windows NT上でPerl for Win32を走らせるのとWindows 95上で走らせるのでは
どんな違いが出るのでしょうか?
5.5. なんでラクダ本にあるサンプルが私の環境では動かないのでしょうか?
5.6. 標準モジュールのZが動かないのはどうしてですか?
5.7. UNIXベースのスクリプトを動くようにするにはどうすればいいのでしょうか?
5.8. Win32プラットホームでchmod関数はどのように機能するのですか?
ご意見、ご要望は、
電子メールまたは
投稿にお願い致します。