ActiveState Home Page       Win32 FAQ


文書名

perlwin32faq5 - 実装上の相違点



概要

PerlのWin32ポート特有の問題



Perl for 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()

System V プロセス間通信関数

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では、exec関数は動作していないように思えます。どうしてでしょうか。

Perl for ISAPI、Perl for WebSite、PerlScriptは、Webサーバや数多くの他のエクステンションとプロセス空間を共有します。 そのため、exec()関数はWebサーバを終了させてしまうため、実装されませんでした。 (exec()はシステムコマンドを発行すると二度と戻ってきません。)



Perl for Win32 と旧3xxビルドの違いは何ですか?

一時期、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用のモジュールかということは心配する必要はありません。 入手して、(必要なら)コンパイルして、使うだけでよいのです。



Perl for Win32を実行する際、Windows NT と Windows 95ではどのような違いがあるのですか?

2つのオペレーティングシステムでPerlを実行する際の違いはほとんどありません。しかし、次の点に留意する必要はあります。:

片方にしかない機能を使うのが不安な場合、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ベースのスクリプトを動くようにするにはどうすればよいのでしょうか?

まず、スクリプトやモジュールの用法に適った使い方をしているかどうか念入りに確認します。 正しく動かないのは自分で書いたコードの所為なのに、モジュールやオペレーティングシステム、インタープリタに責任をなすりつけていることがままあるものです。

自分のコードに問題がないことを確認したら、実行の前に机上で下記のチェックを行います。 以上が、UNIXベースのスクリプトを動くようにするための最善の方法です。 チェックするのは次の点です。:

もちろん、見つけ出したものについては全て対処しなければならないことはいうまでもありません。

スクリプトやモジュールのUNIX依存部を片付けたら、 実施した内容で効果が出ているかどうか、デバッガで実行します。 スクリプトやモジュールに.tテストファイルが付属していれば、それを使って修正したバージョンをテストしてみるのもよいでしょう。

UNIXベースのスクリプトやモジュールを修正する場合、作者に連絡を取ってください。 常にというわけではありませんが、作者は喜んでそのプログラムがPerl for Win32でも動くように修正してくれるでしょう。 作者がプログラムの修正を行わない場合は、他のユーザも使用できるような修正版を作ってもかまわないか尋ねてみてください。



Win32プラットフォームではchmod関数はどのように動作するのですか?

chmod()はPerl for Win32でもサポートされています。 但し、「オーナ」の読み取り、書き込み権の設定しかできません (「グループ」や「その他」のビットは無視されます)。

NTFSを使ったWindows NTシステムでは、 個々のファイルに対してより多い、かつ独特のアクセス権をユーザやグループに付与できるようになっています。 ビルド300以上及びPerl Resource Kit for Win32では、Win32::FileSecurityモジュールでこのファイルアクセス権を保守することができます。



4DOSがコマンドラインの\"を認識しません。

4DOSはコマンドラインのエスケープされたクォートを認識しません。 ダブルクォートされた文字列はすべて、コマンドラインパラメータの区切り文字とみなされるからです。 これは4DOSがcommand.comとうまく調和していない点の一つです。

これを避けるには、Perlの代替クォートメカニズムを利用して、


    perl -e "print \"Hello, World\n\""

を、


    perl -e "print qq(Hello, World\n)"

のように入力します。 ダブルクォートの代わりとなるクォートはqq()、シングルクォートはq()、バッククォートはqx()、リストクォートはqw()です。 丸カッコの部分は、( +、|、{}、<>、# など)任意のものと置き換えることができますが、妙な感じになってしまいます。



NTだと、STDIN や STDOUT、パイプが動作しないことがあります。

Windows NTの関連付けの機能を使ったファイルの出力先をリダイレクトしようとすると、予期せざる結果となることがあります。 その場合は、pl2exeや pl2batを使ってPerlスクリプトを実行ファイルやバッチファイルに変換してください。 それでリダイレクトに生じる問題は全て解決されるはずです。 .



どうしてWindowsではシグナル処理が動作しないのですか。

シグナルはWin32APIではサポートされていません。 Cランタイムはシグナルに対してそのままのサポートを提供していますが、 シグナルハンドラからdie()やexit()することができないなど重大な問題があります。 Perl自身では、シグナルハンドラがメモリアロケーションなどのクリティカルなオペレーションをインターラプトしないことを保証できないのです。 これは、シグナルの実施がperl内部を混乱に陥れるおそれがあることを意味しています。 このような理由から、現時点ではシグナルはサポートされていないのです。



著者および著作権について

この FAQ は、元々Evangelo Prodromou evangelo@endcontsw.comが作成し、保守していたものです。 現在、この文書は、O'Reilly社のBrian Jepson及びActiveState社のDavid GroveとDavid Dmytryshynが改訂・更新しています。

このFAQはパブリックドメインですが、使用する場合はオリジナルの作者について明示してください。

ActiveState Home Page      Win32 FAQ