| Win32 FAQ |
perlwin32faq5 - 実装上の相違点
PerlのWin32ポート特有の問題
Win32システム用のPerlには、実装されていない関数がいつくかあります。 中でも主要なものはalarm()やfork()ですが、これらを使用しているPerlモジュールもいくらか存在しています。 これらの関数はPerl for Win32にはありませんので、それらを使っているモジュールは使用できません。 以下に未実装の関数のリストを示します。:
alarm(), fork(),
getpgrp(), getppid(),
getpriority(), setpgrp(),
setpriority()
endgrent(), endpwent(),
getgrent(), getgrgid(),
getgrnam(), getpwent(),
getpwnam(), getpwuid(),
setgrent(), setpwent()
msgctl(), msgget(),
msgrcv(), msgsnd(),
semctl(), semget(),
semop(), shmctl(),
shmget(), shmread(),
shmwrite()
link(), symlink(),
chroot()
syscall()
getnetbyname(),
getnetbyaddr(), getnetent(),
getprotoent(), getservent(),
sethostent(), setnetent(),
setprotoent(), setservent(),
endhostent(), endnetent(),
endprotoent(), endservent(),
socketpair()
Perl for Win32のビルドイン関数のポータビリティについての詳細は、perlportとperlwin32ドキュメントを参照してください。
Perl for ISAPI、Perl for WebSite、PerlScriptは、Webサーバや数多くの他のエクステンションとプロセス空間を共有します。 そのため、exec()関数はWebサーバを終了させてしまうため、実装されませんでした。 (exec()はシステムコマンドを発行すると二度と戻ってきません。)
一時期、Win32プラットフォームのPerlはGurusamy SarathyのポートとActiveStateのポートという2つのバージョンがありました。 ActiveStateのPerlポートには、Perl for ISAPIとPerlScriptなどのツールが含まれていましたが、標準のPerlと多少異なり、Perl内部の公開を顧みていませんでした。 Sarathyのポートは標準のPerlと高い互換性を備えていました。そのため、Sarathyのポートのユーザは、ActiveState Perlとは互換性のなかった多くのモジュールを使用することができました。
一つのPerlへの努力が両Perlポートの統合をもたらし、Perl for Win32がWin32システム向けの標準Perlディストリビューションとなりました。 このポートでは、Win32上で動くモジュールはすべて使用することができます。 もう、どのPerl用のモジュールかということは心配する必要はありません。 入手して、(必要なら)コンパイルして、使うだけでよいのです。
2つのオペレーティングシステムでPerlを実行する際の違いはほとんどありません。しかし、次の点に留意する必要はあります。:
Win32::NetAdmin、Win32::NetResource、Win32::EventLog モジュールはWindows 95では動きません。
Windows NTでは問題なく動くものの、Windows 95では動かなかったり、バギーな関数がいくつかあります。flock()がその一例です。
最後に、Windows NTでは利用できる多くの有益なプログラムがWindows 95にはありません。 たとえば、hostnameはWindows 95にはありません。
片方にしかない機能を使うのが不安な場合、Win32::IsWinNT()の結果でどちらのOSで実行されているか確認することができます。 詳しくは、Perl for Win32 ディストリビューションにはどのようなモジュールが付属していますか?を参照してください。
ラクダ本(プログラミング Perl 第2版、Wall他、オライリージャパン発行)は、ざっくりと言えばUNIX愛好者がUNIX愛好者のために書いたものです。
ラクダ本にあるサンプルの一部は動きますが、動かないものも一部あります。 動かない場合は、使っている関数がないか、外部ツールがないか、モジュールが使えないことによるものです。 小さいスクリプトであれば、正しく動作するようになるまで いじることもそう難しいことではありません ( UNIXベースのスクリプトを動くようにするにはどうすればよいのでしょうか?参照)。
ラクダ本とリャマ本は良い教材です。しかしながら、Perl for Win32 のプログラマーとしては、UNIXをターゲットとしたスクリプト やモジュールをPerl for Win32に移植する方法も学ぶ必要があります。
Perl for Win32を使ったサンプルについては、オライリージャパン社発行の「初めてのPerl Win32システム」(ヤモリ本)を見るとよいでしょう。
Perl for Win32では、Win32上でビルドできるものであれば、 ほとんどすべてのモジュールをPerl for Win32と共に動かすことができます。 かつて、3xxバージョンのPerl for Win32で起きていた問題は、もはや存在しません:モジュールはWin32で動きます。 Win32プラットフォーム用のこのPerlポートなら動く、いやあのPerlポートなら動くということはなくなったのです!
モジュールが動かない場合、使っている関数がUNIX特有のものでWin32では動かない、あるいは、NT特有のものでWindows 95 や Windows 98では動かないということが考えられます。
まず、スクリプトやモジュールの用法に適った使い方をしているかどうか念入りに確認します。 正しく動かないのは自分で書いたコードの所為なのに、モジュールやオペレーティングシステム、インタープリタに責任をなすりつけていることがままあるものです。
自分のコードに問題がないことを確認したら、実行の前に机上で下記のチェックを行います。 以上が、UNIXベースのスクリプトを動くようにするための最善の方法です。 チェックするのは次の点です。:
Perl for Win32に実装されていない関数をコールしていませんか。 その一覧は、 Perl for Win32では動作しない関数があるように思えます。を参照してください。
Perl for Win32では使用できないCPANモジュールや動作しない標準ライブラリモジュールを使っていませんか。
system()やバッククォート(``)で、Perl for Win32では使用できないシステムツールをコールしていませんか。
バイナリのファイルを読み取り、書き込みしていませんか。 ファイルの読み取り、書き込みがなぜか失敗します。どこがおかしいのでしょうか。 参照。
ファイルシステムに依存したパス名やパス名の分解(parse)はありませんか。 /usr/libのようなUNIXのパスがハードコードされていないかしっかりと見ます。
モジュールやスクリプトが特定のバージョンのPerlや他のモジュールを前提にしていませんか。
require 5.003; や require Sockets 1.03;のようなものに注意します。
そのスクリプトやモジュールが、インストールされているバージョンよりも新しいものを必要としていないかどうかチェックします。
もちろん、見つけ出したものについては全て対処しなければならないことはいうまでもありません。
スクリプトやモジュールのUNIX依存部を片付けたら、 実施した内容で効果が出ているかどうか、デバッガで実行します。 スクリプトやモジュールに.tテストファイルが付属していれば、それを使って修正したバージョンをテストしてみるのもよいでしょう。
UNIXベースのスクリプトやモジュールを修正する場合、作者に連絡を取ってください。 常にというわけではありませんが、作者は喜んでそのプログラムがPerl for Win32でも動くように修正してくれるでしょう。 作者がプログラムの修正を行わない場合は、他のユーザも使用できるような修正版を作ってもかまわないか尋ねてみてください。
chmod()はPerl for Win32でもサポートされています。
但し、「オーナ」の読み取り、書き込み権の設定しかできません
(「グループ」や「その他」のビットは無視されます)。
NTFSを使ったWindows NTシステムでは、 個々のファイルに対してより多い、かつ独特のアクセス権をユーザやグループに付与できるようになっています。 ビルド300以上及びPerl Resource Kit for Win32では、Win32::FileSecurityモジュールでこのファイルアクセス権を保守することができます。
4DOSはコマンドラインのエスケープされたクォートを認識しません。 ダブルクォートされた文字列はすべて、コマンドラインパラメータの区切り文字とみなされるからです。 これは4DOSがcommand.comとうまく調和していない点の一つです。
これを避けるには、Perlの代替クォートメカニズムを利用して、
perl -e "print \"Hello, World\n\""
を、
perl -e "print qq(Hello, World\n)"
のように入力します。 ダブルクォートの代わりとなるクォートはqq()、シングルクォートはq()、バッククォートはqx()、リストクォートはqw()です。 丸カッコの部分は、( +、|、{}、<>、# など)任意のものと置き換えることができますが、妙な感じになってしまいます。
Windows NTの関連付けの機能を使ったファイルの出力先をリダイレクトしようとすると、予期せざる結果となることがあります。 その場合は、pl2exeや pl2batを使ってPerlスクリプトを実行ファイルやバッチファイルに変換してください。 それでリダイレクトに生じる問題は全て解決されるはずです。 .
シグナルはWin32APIではサポートされていません。 Cランタイムはシグナルに対してそのままのサポートを提供していますが、 シグナルハンドラからdie()やexit()することができないなど重大な問題があります。 Perl自身では、シグナルハンドラがメモリアロケーションなどのクリティカルなオペレーションをインターラプトしないことを保証できないのです。 これは、シグナルの実施がperl内部を混乱に陥れるおそれがあることを意味しています。 このような理由から、現時点ではシグナルはサポートされていないのです。
この FAQ は、元々Evangelo Prodromou evangelo@endcontsw.comが作成し、保守していたものです。 現在、この文書は、O'Reilly社のBrian Jepson及びActiveState社のDavid GroveとDavid Dmytryshynが改訂・更新しています。
このFAQはパブリックドメインですが、使用する場合はオリジナルの作者について明示してください。
| Win32 FAQ |