Perl初心者の部屋
PageID:Perl-Newbie
Last update:00.04.03

Perl初心者のFAQのページ

1)UNIX上でperlを使用しているのですが、%perlでは起動せず %/PERL5PATH/perlとしなければ 起動しません。どの設定ファイルを修正すれば良いのでしょうか。 たぶんそのせいでCGIスクリプトも動かないようなのです。

2)包括的なマニュアルはどこにあるのですか。

3)Perl 5でlocaltime()を使って YYMMDD形式にするにはどうしたらいいのでしょうか?

4)マニュアルによると、UNIXファイルは、touch後にchmodコマンド で属性の変更が出来るとありますがNTではどうすればよいのですか?。

5)新規データファイルの作成方法を教えてください。(0バイト ファイル)

6)PerlからCのEXEファイルはCALL出来ませんか?

7)ホームページを作成中ですが、perlで組んだCGIプログラムから Document contains no data というエラ ーメッセージが返ってきます。

8)サーバ上でperlスクリプトからファイルのパーミッションを変更するchmodを実行すると問題なくできるのですが、ブラウザからCGIで同じperlスクリプトを使って、 サーバにあるファイルのパーミッションを変更しようとしてもうまくいきません。

9)ファイルを新規作成するCGIスクリプトを書いたのですが、 CGIではファイルを作成できません。コマンドラインでは 問題なく動くのですが、アクセス権限の 問題なのでしょうか?

10)スクリプトはシェル(コマンドライン)からはちゃんと動くのですが、 ブラウザから実行させようとすると「Server Error 500」というような 一般エラーメッセージが返ってきたり、スクリプトのソースが 出たりします。何がおかしいのでしょうか?

11)MacPerlの日本語の解説書は出ていますか?

12)英語が苦手な人は、JPerlのほうが良いのですか?

13)perlのCGIプログラムをテストするにはどのようにすればいいのでしょうか?

14)perlのプログラムは何に書けばいいのでしょうか? メモ帳なんかでもよいのでしょうか?(Winodws)

15)初心者用の本で何かいいものはありませんか?

16)Windows95ではPerlは不可能なのでしょうか? どの初心者用の本も、UNIXを前提にしています。
可能であれば、何を準備すればいいのでしょう。

17)perl for win32をダウンロードしたもののperl.exeをエクスプローラから実 行するとms-dosモードになってウンともスンともいわない状態です。これで正し いのか問題があるのか・・。perlのスクリプトがどういった状態で perl for win32で動作するのかが分かりません。教えてください。

18)WindowsでPerlを使おうとしています。書籍等に #!/usr/lib/perlとか出ていますが、この意味がわからないのです。 教えてください。

19)HTMLを出力するのに print "<BODY BGCOLOR="#00ff00">\n"; などとすると#以降が出力されず、文法エラー になってしまいます。どうしたらいいのでしょうか。

20)日本語のPerlメーリングリストありましたら紹介してください。

21) "ソフト"という文字列を使ったPerlスクリプトをCGIを ブラウザから実行した時に、文字化けしてしまいます. 他にもこのような単語がいくつかあります。 どうしてでしょうか。また、どうすればいいのでしょうか。

22) Part2−情報源の 2-3)らくだ本やラマ本・・・の意味を教えてください。

23) MS-Windowsにperlをインストール後、インストールの確認をするためバージョン情報を出そうと perl -v と入力しても、エラーメッセージらしきものが出てすぐに消えてしまいます。

24) MS-WindowsでMS-DOSプロンプトのコマンドラインからスクリプトを実行しようとしたのですが、うまくいきません。

25) Perlの初心者です。何から手をつければ良いのかわかりません。

26) BIGLOBEでCGIを実行しようとしましたが、Internal Server Errorというメッセージがブラウザに表示されてうまくいきません。文法チェック済みでファイルのパーミッション、パス等の設定にも間違いはありません。

27) 加入しているブロバイダ(ISP)ではtelnetを開放していないので、Perlのバージョン確認ができません。

28) あるところに、

perl[Enter] print 'hello'[Enter] [Ctrl+d] と入力するとhelloと出力されると記述されていたので、MS-DOSプロンプトから同じように入力してみたのですが、妙な記号が出てくるだけで表示されず、処理も終わりません。

29) 「コマンドラインから入力する」という記述がありますが、コマンドラインとは何のことですか。

30) PerlのFAQやサンプル文、関数の機能、モジュールの使い方等を調べたいのですが、何が参考になりますか。

31) WindowsでCPANモジュールを初めて使ったのですが、gzipやtar等の位置を質問されてきました。どのように対応すればよいのでしょうか。

31) Windowsで以下のようにしてCPANモジュールを初めて使ったのですが、gzipやtarの位置を質問されてきました。どうすればよいのでしょうか。

perl -MCPAN -e shell

tarやgzip、makeの代用品であるdmake/nmakeは通常Windowsには入っていませんので別途入手する必要があります。但し、中にはコンパイラを必要とするモジュールもあるので、MS-WindowsであればActivePerlのppmユーティリティを利用するほうが無難です。
MS-Windows用tar.exe、gzip.exe等は下記等で入手可能です。

【MS-Windows用tar、gzip等の入手先&参考リンク】
dmake:
http://www.perl.com/CPAN/ports/win32/Standard/x86/perl5.00402-bindist04-bc.zipに含まれています。
nmake:
ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe
http://w3.gzip.org/gzip124xN.exe
ftp://ftp.etl.go.jp/pub/mule/Windows/tools/
データ圧縮入門:
http://www.matsusaka-u.ac.jp/~okumura/compression/intro.html

CPANモジュールの設定を変更したい場合、CPANモジュールをシェルモードで起動(perl -MCPAN -e shell)し、cpanプロンプトで

cpan&gt;o conf init のように入力します。また、/usr/lib/perl5/5.00503やC:\perl\libのようなライブラリディレクトリにあるCPAN/Config.pmを直接編集することもできます。

30) PerlのFAQやサンプル文、関数の機能、モジュールの使い方等を調べたいのですが、何が参考になりますか。

まず、添付ドキュメントを調べてみましょう。 MS-Windowsであれば、(PerlをC:\perlにインストールした場合) エクスプローラでC:\perl\htmlフォルダをクリックしておき、 エクスプローラ→ツール→検索→名前と場所→含まれる文字列 に、調べたい文字を入力するといろいろ検索してくれます。
また、コマンドプロンプトからperldocを使って調べることもできます。 > perldoc -f 組み込み関数名(flock) > perldoc -q FAQの見出しのキーワード(lock) > perldoc -m モジュール名(Time/Local) perldocの詳しい使い方は、 > perldoc perldoc とすれば、表示されます。

29) 時々「コマンドラインから入力する」というような記述を見かけますが、コマンドラインとは何のことですか。

MS-Windowsだと、MS-DOSプロンプト(俗称DOS窓)やコマンドプロンプトで、カーソルが点滅している入力待ちの行のことです。

28) あるところに、 perl[Enter] print 'hello'[Enter] [Ctrl+d] と入力するとhelloと出力されると記述されていたので、MS-DOSプロンプトから同じように入力してみたのですが、妙な記号が出てくるだけで表示されず、処理も終わりません。

その記述はUNIXをベースとした場合の記述と思われます。Linux等では、デフォルトだと[Ctrl+d]にEOF(End Of File:ファイルの終わりを示す)がマッピングされています。MS-DOSでは、下記のように[Ctrl+z]がEOFにマッピングされていますので、[Ctrl+z]を代わりに使えばその後に「hello」と表示されるはずです。

 
MS-DOS
UNIX(よくあるデフォルト設定)
EOF(ファイルの終わり)
Ctrl+z
Ctrl+d
処理の停止(stopシグナルを送る)
n/a
Ctrl+z
処理の打ち切り(interruptシグナルを送る)
Ctrl+c
Ctrl+c
最後にタイプされた文字を消去する
Ctrl+h
Ctrl+h
quitシグナルを送る
n/a
Ctrl+\
出力の停止
Ctrl+s
Ctrl+s
出力の再開
Ctrl+q
Ctrl+q
現在の行を消去する
Ctrl+u
Ctrl+u

27) 加入しているブロバイダ(ISP)ではtelnetを開放していないので、Perlのバージョン確認ができません。

通常、プロバイダの問い合わせ窓口で確認してもらえるはずです。その程度の回答ができないようなレベルのプロバイダだと、引越をお勧めします。当面居留せざるをえない場合、以下のようなスクリプトで確認できるはずです。但し、これらはサーバの内部情報を表示するため、確認後直ちに削除した方がよいでしょう。 (UNIX系でperlが/usr/binにある場合の例)

-------------8<------------8<-------------------- #!/usr/bin/perl $| = 1; $usr_bin_perl = `/usr/bin/perl -v`; #$usr_local_bin_perl = `/usr/local/bin/perl -v`; #$usr_local_bin_perl5 = `/usr/local/bin/perl5 -v`; print "Content-type: text/html\n\n"; print "<html><body>\n"; print "/usr/bin/perl -v output = <BR>\n"; # print "<pre>$usr_bin_perl</pre>\n"; # print "/usr/local/bin/perl -v output = <BR>\n"; # print "<pre>$usr_local_bin_perl</pre>\n"; # print "/usr/local/bin/perl5 -v output = <BR>\n"; # print "<pre>$usr_local_bin_perl5</pre>\n"; print "</body></html>\n"; -------------8<------------8<-------------------- Perlの在処を見つけるCGIスクリプトの例

・UNIX系のsh系シェルを使って/usr/bin /usr/local/binを検索する例

-------------8<------------8<-------------------- #!/usr/bin/perl $found = `find /usr/bin /usr/local/bin -name perl* -print 2> /dev/null`; print "Content-type: text/html\n\n"; print "<html><body>\n"; print "find output = <BR>\n"; print "<pre>$found</pre>\n"; print "</body></html>\n"; -------------8<------------8<--------------------


26) BIGLOBEでCGIを実行しようとしましたが、Internal Server Errorというメッセージがブラウザに表示されてうまくいきません。文法チェック済みでファイルのパーミッション、パス等の設定にも間違いはありません。

BIGLOBEでは、/usr/bin/perl にあるperlはPerl4となっています。そのため、Perl5から追加された関数等を使用しているとエラーになってしまいます。Perl5は、/usr/local/bin/perl5 にありますので、 各CGIスクリプトの先頭行を
#!/usr/bin/perl
から
#!/usr/bin/local/perl5
に変更する必要があります。


25) Perlの初心者です。何から手をつければ良いのかわかりません。

(1)PerlのFAQ集、特に最初の方の部分にまず目を通しましょう。
疑問に思うことの多くが、結構FAQ集に含まれてます。 FAQは以下のコマンドで参照できます。

	>perldoc perlfaq
MS-Windows用のActivePerlでは、インストールディレクトリの下の\html\lib\PodディレクトリにHTMLファイルとして格納されています。なお、翻訳されたものが以下のURL他で公開されています。

http://www.kt.rim.or.jp/%7ekbk/perl5.005/index.html

http://www.harukaze.net/~mishima/perl/faq/faq0j.html

(2)Perl関連の入門書を読みましょう。
他言語によるプログラミングを経験している人、 プログラミングがはじめての人、 PCの仕組み等に習熟していない人 等でそれぞれ参考になる書籍は変わるはずなので、 自分のレベルに合っていると思われるものを購入して、一通り目を通すとよいでしょう。多少わからない個所があっても、ざっと目を通すというのがポイントです。 そのうえでわからない点があれば、詳細にその書籍を読んだり、他の書籍やWWWを調べます。それでもわからない場合は、下記のネットニュースやメーリングリストで質問するとよいでしょう。

(3)Perlの実行環境を構築しましょう。
自分のPCがあれば、Perlが手許で自由に使えるようPerlをインストールして実際に動かしてみましょう。 CGIが目的であれば、合わせてWWWサーバのインストールも行うとよいでしょう。

(4)どうしてもわからないことがあれば尋ましょう。
Perlのインストールや使い方、WWWサーバの設定の仕方等でFAQ集や書籍ではどうしてもわからないことが出てきたら、ネットニュースやメーリングリストを利用するとよいでしょう。但し、よく調べないで安易に質問するという姿勢は控えましょう。

fj.comp.lang.perl
オススメ日本語メーリングリスト


24) MS-WindowsでMS-DOSプロンプトのコマンドラインからスクリプトを実行しようとしたのですが、うまくいきません。

まず、エラーメッセージの内容をチェックします。

例)
【症状】
・MS-DOSプロンプトで「コマンドまたはファイル名が違います」というメッセージが出る時:

【原因】
perl実行プログラムのパスがうまく設定されていないためと考えられます。

【対応策】
autoexec.bat(Win95/98)、コンパネのシステム(NT)、のパス環境変数%PATH% を正しく設定します(UNIX系なら#!行)。 perl実行プログラムのパスが通っているかどうかは以下で確認できます。

    C:\> perl -v
【症状】
・MS-DOSプロンプトで「Can't open perl script "xxx.pl":No such file or directory」などのメッセージが出る時:

【原因】
指定したスクリプトがperlのスクリプト検索パスが通っている場所にないためと考えられます。

【対応策】
例えば、MS-Windowsの場合、
	#!/usr/bin/perl
	print "hello,world!\n";
という内容のhello.plファイルを、perl.exeをインストールしたC:\perl\binに置いておき、MS DOSプロンプトでC:\WINDOWSディレクトリから
      C:\WINDOWS>perl hello.pl
としても、通常エラーとなります。
perlは、指定されたスクリプトファイルが
      perl -V
の最後に出力される@INC中のディレクトリ群にないか検索します。 通常このディレクトリ群には、(カレントディレクトリを示す)「.」が 入っていますが、上記のケースではhello.plはC:\perl\binにあり、 カレントディレクトリにはありません。(カレントディレクトリは「C:\WINDOWS」です。) ということで、「そんなファイルはない」というメッセージが出るわけです。
対策としては

1.フルパスで指定する。

     C:\WINDOWS>perl \perl\bin\hello.pl
2.スクリプトファイルを置いているディレクトリにカレントディレクトリを変更する。
     C:\WINDOWS>cd \Perl\bin
     C:\Perl\bin>perl hello.pl
3.Perlの検索パス(\libで表されるライブラリディレクトリ:この場合、C:\PERL\lib、C:\PERL\site\lib など)にスクリプトファイル(hello.pl)を置く

が考えられます。 3.でもよいのですが、あまり繰り返すとどれがオリジナルのファイルで どれが自分がテストしたファイルかわからなくなることがあるので、 2.がオススメではないでしょうか。

23) MS-Windowsにperlをインストール後、インストールの確認をするためバージョン情報を出そうと perl -v と入力しても、エラーメッセージらしきものが出てすぐに消えてしまいます。

おそらく、下記のようなメッセージが現れていると思います。

Unrecognized file test: -v at - line 1. 原因は、次のようなことを行っているためと考えられます。 1.perl.exeをダブルクリックする。<BR> 2.左上にperlというタイトルのついたMS-DOSプロンプトのような画面が現れる。<BR> 3.perl -v [Enter]と入力する。 この場合、一瞬エラーメッセージが現れますが、すぐに画面自体が消えてしまいます。

対策は、MS-Windows95/98の場合、 スタート→プログラム→MS‐DOSプロンプト等で「MS‐DOSプロンプト」を開くことです。この時左上のタイトルはMS‐DOSプロンプトとなってるはずです。ここで、

perl -v [Enter] と入力します。

22) Part2−情報源の 2-3)らくだ本やラマ本・・・ の意味を教えてください。

ソフトバンク社発行の「Perlプログラミング」 原著:Programing Perlをラクダ本、 「はじめてのPerl」同:Learning Perlをラマ本といいます。 由来は原著発行元のオライリー社が表紙絵にそれぞれラクダ、ラマを 使っていることにあります。

21)"ソフト"という文字列を使ったPerlスクリプトをCGI で ブラウザから実行した時に、文字化けしてしまいます. 他にもこのような単語がいくつかあります。 どうしてでしょうか。また、どうすればいいのでしょうか。
例: #!/user/local/bin/perl print "HTTP/1.0 200 OK\n"; print "Content-Type: text/html\n\n\n"; print "<HTML><BODY>"; print "<TITLE>hoge</TITLE>"; print "<H2>hoge</h2>"; print "hogeソフト<BR>"; print "</BODY></HTML>";

"ソ"のシフトJISコードは"835C"で、 2バイト目の"5C"はASCIIコードでは "\" を表します。しかし、 perlでは"\"はエスケープや参照を意味します。このため、 perlは次の"フ"のシフトJISコード"8374"の1バイト目を エスケープしようとするため、字句解析がずれ文字化けが発生します。 したがって、 print "hogeソフト<BR>"; print "hogeソ\フト<BR>"; とすると、"\"をエスケープした結果として文字コードとしての"\" (すなわち、5C)が得られ835Cのコードとなり、字句解析が 正しく行われるようになり文字化けは解消されます。 シフトJISコードには、このような字句解析に不都合なASCIIコードが いろいろあるため、なるべくEUCコードを使用されることを推奨します。
Perlで日本語を扱う際の留意点 も参照して下さい。

この項はJinko Tsujinagaさんのご協力を頂きました。 ありがとうございました。

20)日本語のPerlメイリングリストありましたら紹介してください。

Perl関連のオススメ日本語メーリングリスト を参照してください。

19) HTMLを出力するのに
	print "<BODY BGCOLOR="#00ff00">\n";
などとすると#以降が出力されず、文法エラー になってしまいます。どうしたらいいのでしょうか。

これは、
	print "<BODY BGCOLOR="    #00ff00   ">\n";
のように分けてみるとよくわかると思います。 当然 "<BODY BGCOLOR=" は文字列として認識されますが、#00ff00以降は コメントとして認識されてしまいます。
このように出力したい文字列の中にダブルクォートが含まれている場合、 \でダブルクォートをエスケープしてみて下さい。
	print "<BODY BGCOLOR=\"#00ff00\">\n";
#あるいは下記でもいけるかもしれません..。
	print qq$<BODY BGCOLOR="#00ff00">\n$;

18)WindowsでPerlを使おうとしています。書籍等に #!/usr/lib/perlとか出ていますが、この意味がわからないのです。 教えてください。

これはUNIXのシェルにこのファイルを 実行すべきプログラムを認識してもらうための「おまじない」(notation)で、 Windows(のcommand.com/com.exe)では効力がありません。 16bitプログラムで#!perl.exeというものがあり、これを応用すると このおまじないを認識して実行できますが、お勧めしません。 とりあえずは、.BATファイルにしたほうがいいでしょう。
#NTではレジストリで.plファイルとperl.exe(perlIS.dll)とのリンクが可能。
BATファイルの中身については
Windows 95/NTでPerl&CGIのページ
Windows NTでCGIのページ
Unix-Win32 Perl の違い
等を参照してください。

17)ActivePerlをダウンロードしたもののperl.exeをエクスプローラから実 行するとms-dosモードになってウンともスンともいわない状態です。これで正し いのか問題があるのか・・。perlのスクリプトがどういった状態で ActivePerlで動作するのかが分かりません。教えてください。

perlのスクリプトは、いわゆるコマンドライン (Windows95でいうとDOS窓)から実行します。 UNIXだと#!/usr/lib/perl -wT等のおまじないを書き、 hoge.plとかいうファイル名にして 実行権をあたえておいて、コマンドラインからhoge.plと打鍵すれば 走ってくれます。Windowsで 上記のようにエクスプローラから実行しただけでは、 コマンドライン(DOS窓)でperl.exeと打鍵したのと同じで、 実行すべきスクリプトを与えていないので、その餌(実行すべきスクリプト) を口を開けてずっと待っている状態になっているわけです。 コマンドライン(DOS窓)で
	C:\hoge>perl hoge.txt [hogehoge(引数)]
のように打鍵すれば(PATHが有効なら)hoge.txtスクリプトが走るハズです。 とりあえず、
	C:\hoge>perl -v
と打鍵してみましょう。ちゃんとインストールされていれば、
This is perl, version 5.005_03 built for MSWin32-x86-object
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-1999, Larry Wall

Binary build 518 provided by ActiveState Tool Corp. http://www.ActiveState.com
Built 13:14:00 Jun 24 1999


Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5.0 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
ActivePerlに対応したJPerlなら
This is perl, version 5.005_03 built for MSWin32-x86-object
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-1999, Larry Wall

Japanization patch 4 by Yasushi Saito, 1996

Modified by Hirofumi Watanabe, 1996-1999
jperl5.005_03-990703
SJIS version

Binary build 518 provided by ActiveState Tool Corp. http://www.ActiveState.com
Built 20:13:08 Aug 10 1999


Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5.0 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
のように出るはずです。


16)Windows95ではPerlは不可能なのでしょうか? どの初心者用の本も、UNIXを前提にしています。
可能であれば、何を準備すればいいのでしょう。

若干の制約はありますが、Windows95でもPerlは動きます。 まず、Perl5 for Win32 (ActivePerl)あるいはJPerl5 for Win32を 用意しましょう。詳細は
WindowsNT/95/98でPerlのページ をご覧下さい。
#但し、CGIはサーバ側で動くものです。PerlでCGIスクリプトを 書く環境はできてもWWWサーバがないと完成状態が確認できません。


15)初心者用の本で何かいいものはありませんか?

ホームページに掲載している私の著書と言いたい所ですが、最近良書が数多く出てきています。
Perl関連の書籍
の初級ランクの書籍がお勧めだと思います。


14)perlのプログラムは何に書けばいいのでしょうか? メモ帳なんかでもよいのでしょうか?(Winodws)

はい。ファイル名に.txtが自動的につきますが スクリプトファイル名をhoge.txtと指定すれば済みますし、 BATファイルはファイル名を.batに変更すればすみます。
#コマンドライン(DOS窓)からPerlスクリプトのファイル名を 入力するとき、.txtを忘れないように。
	C:\hoge>perl hoge.txt [hogehoge(引数)]


13)perlのCGIプログラムをテストするにはどのようにすればいいのでしょうか?

常に、最初はコマンドラインから走らせしましょう。 また、下記を参照してください。
Perl CGI FAQ #Q4.19
本来サーバでやるのが望ましいのですが、プロバイダでは シェルサービスをしているところが少なく、なかなか難しいかと思います。 そのような方は、まず手元のPCにPC用WWWサーバを導入してテスト してみてはいかがでしょう。 但し、Perl for Win32等はUNIX版に比べて制約がありますので、 エラーにならないよう一時コメント化する等留意しましょう。

12)英語が苦手な人は、JPerlのほうが良いのですか?

Jperlは検索や日本語がうまく通らない種々の機能に手を加えて ちゃんと日本語処理ができるようにしたものです。 したがって英語レベルとは関係はありません。(^ ^


11)MacPerlの日本語の解説書は出ていますか?

「MacPerl入門」という本が出ています。詳しくは、
Perl関連の書籍 を参照してください。


10)スクリプトはシェル(コマンドライン)からはちゃんと動くのですが、 ブラウザから実行させようとすると「Server Error 500」というような 一般エラーメッセージが返ってきたり、スクリプトのソースが 出たりします。何がおかしいのでしょうか?


下記のことを確認してみましょう。
(a)そのスクリプトはWWWサーバでの読込権と実行権を設定されていますか?
シェル(コマンドライン)から実行したとき、そのスクリプトはあなたの ユーザIDのもとで走っており、そのユーザIDに認可されている全てのリソース に対してアクセスが可能です。
一方、URLとして公開されているCGIスクリプトは Web上でいろいろなユーザから実行されるので、権限を限定された特別なユーザID ( 8)と9)を参照)のもとで走るように設定されます。 スクリプト及びperlの権限を再確認してみましょう。(双方に読込と実行権が必要)

(b)スクリプトを置いているディレクトリは、WWWサーバが制御可能な権限に なっていますか?
上記の通り、スクリプトを置いているディレクトリ(通常/cgi-binあるいは\Scripts) の権限は一般ユーザに対し読込/実行権が設定されていることが必要です。

(c)スクリプトを置いているディレクトリは、スクリプトディレクトリとして 設定されていますか?
たとえば、NCSA HTTPDだとsrm.confファイルに
ScriptAlias/cgi-bin/ cgi-bin/
のように設定されていることが必要です。
#設定方法はWWWサーバで異なります。

(d)ブラウザに何かデータが出ている場合、ちゃんとContent-typeヘッダが 送られてきていますか?
「malformed header from script」エラーが表示されているようですと、 ちゃんとContent-typeヘッダ等がついていないケースが大半です。

(e)何か別のエラーメッセージがないかサーバのエラーログを調べてみましたか?
スクリプトからのエラーメッセージは通常STDERR(標準エラー出力)に送られ、 画面に出てきます。しかし、WWWサーバがSTDERRをエラーログにリダイレクト (別なところにひもづけしてそちらに出力)していることもあります。 grep等の機能を使ってエラーログにスクリプトからのメッセージがないか 確認してみましょう。

(f)HTMLとしてブラウザにエラーメッセージが戻るようにしてみましたか?
スクリプトは実行できるけど一部がうまくいかないという場合、 エラーメッセージをタグ等で括って標準出力に出してみたら どうでしょうか? 特にディレクトリの移動、ファイルの読み書き等のシステムリソースを 操作する場合、うまくいかなかったときのルーチンで上記を行えば 問題部分が明確になるでしょう。(^^

この問答欄(10)は<march@europa.com>氏のThe CGI FAQ: General Questions を 意訳したものです。


9)ファイルを新規作成するCGIスクリプトを書いたのですが、 CGIではファイルを作成できません。コマンドラインでは 問題なく動くのですが、アクセス権限の 問題なのでしょうか?


	open(INOUT, "+>hoge.txt") ;
	print INOUT "hellow world\n";
	close(INOUT);

CGIは通常、サーバのユーザ権限レベルで実行されます。
# 8)でも述べましたが、例えばUNIXのNCSA等ではnobody、 IISではanonymousとかIUSR_computername (インストール時にマシンの名前を入れたもの) がデフォルトのインターネットゲストアカウントです。
一般的には、スクリプトを置くディレクトリあるいはフォルダー (UNIXであれば通常/cgi-bin、MS-IISでは\Scripts)はセキュリティの為、 システム管理者のみ全権限を持っており、 一般ユーザに対しては書き込みは禁止にし、実行/読み(R-X)のみ可能に されています。 このディレクトリにファイルを新規作成しようとしても書込権限がないので ファイルオープンは失敗します。
したがって、ファイルを作成するディレクトリ(フォルダ)を別に用意し、 そのディレクトリ(全:rwx)とスクリプト(実行:--x)の権限を上記の ユーザアカウント(nobody等)に対して許可すれば動くはずです。


8)サーバ上でperlスクリプトからファイルのパーミッションを変更するchmodを実行すると問題なくできるのですが、ブラウザからCGIで同じperlスクリプトを使って、 サーバにあるファイルのパーミッションを変更しようとしてもうまくいきません。


注)これはUNIXサーバに対してのみ有効な問答です。
hogeさんは"hoge"として一般ユーザ権限をもっています。 もちろんperlの実行権も持っています。
また、XXXディレクトリは一般ユーザに対し、読み/書き/実行の権限を設定して あるとします。 hogeさんがXXXディレクトリにある、所有者のみ読み/書きできるよう設定してある (自分しか読み書きのアクセス権限がない)hoge.datファイルに対し、 コマンドラインから次のスクリプトを実行した場合はうまくいきます。 #実行ユーザ=hoge:所有者=hoge(のみアクセス権限=読み/書き)
   #!/usr/bin/perl
   chmod 0666,"hoge.dat";
これで、誰でもアクセスできるようになります。 でも、"hogehoge"のIDを持つhogehogeさんがこのスクリプトを実行しても hoge.datのオーナではないのでうまくいきません。
#実行ユーザ=hogehoge:所有者=hoge(のみアクセス権限=読み/書き)で 拒否されるため

同様なことをブラウザからCGIを使ってやろうとした場合、 実行される次のスクリプトの実行ユーザは誰になるのでしょう?

#!/usr/bin/perl
print "Content-type: text/html\n\n";
       :
       :
chmod 0666,"/XXX/hoge.dat";
UNIXのNCSA等のWWWサーバでは特に設定しない場合、このスクリプトは 実行ユーザnobodyとして実行されます。 したがって、ファイル所有者hogeではないため、うまくいかないのです。 この場合、ファイルの所有者をnobodyにしておけばうまくいきます。

#マイクロソフトのIISではIUSR_computername(インストール時に マシンの名前を入れたもの)が実行ユーザになるようです。


7)perlで組んだCGIプログラムから Document contains no data というエラ ーメッセージが返ってきます。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
system("/bin/date");
このcgiプログラムをNetscapeブラウザーから直接指定すると、  Document contains no data というエラーメッセージが返ってくることがあります。
次のようにして 標準出力をバッファリングしないようにしてみてください。
  #!/usr/bin/perl
  $|=1;           # 標準出力をフラッシュする
  print "Content-type: text/html\n\n";
  system("/bin/date");



1)UNIX上でperlを使用しているのですが、%perlでは起動せず %/PERL5PATH/perlとしなければ 起動しません。どの設定ファイルを修正すれば良いのでしょうか。 たぶんそのせいでCGIスクリプトも動かないようなのです。

%echo $PATH と打鍵してみてください。 返ってきた出力に/PERL5PATH/ がありますか?
無いようでしたら、探索パス上にperlがないということですから 質問のように絶対パスを入力しないとシェルは、perlの居場所が わからんわけです。 私はCシェルは使わないので、いまいち不確かですが(^^;;  ホームディレクトリの .login あるいは .cshrc に 
set PATH=$PATH:/PERL5PATH/
あるいは
set perlpath = ( /PERL5PATH )
set path = ( $path $perlpath )
unset perlpath
と追加すれば、とりあえず絶対PATHは不要になると思われます。
(%env でも環境変数の内容を確認できます。)

CGIのほうですが、これはperlを書いたファイルの1行目に
#!/PERL5PATH/perl
というおなじないを入れとけば、perlの認識はしてくれます。 但し、CGIをちゃんと動かすには、WWWサーバの設定やCGIプログラム の置き場所、実行権限等絡みますので、これだけで解決するとは 限りません。
システム管理者の方にご相談しましょう。

注)PERL5PATHは架空のディレクトリです。この通り入力しても 多分NGです。perlが置いてあるディレクトリ名をご使用下さい。


2)包括的なマニュアルはどこにあるのですか。


英語版ですが、Perl.comにいろいろ揃っています。
ftp://ftp.perl.com/pub/perl/doc/
            MetaFAQ-1.4.gz
            FAQ.gz

            PerlDoc-Cover.ps.gz
            PerlDoc-TOC.ps.gz
            PerlDoc-5.001m.ps.gz

            perlref-5.0.tar.gz
            tk-userguide.ps.gz          

            cgi_docs.ps.gz
            cgi-faq.gz
            www-security-faq.ps.gz
            how-to-cgi.ps.gz            


3)NTPerl 5でlocaltime()を使って YYMMDD形式にするにはどうしたらいいのでしょうか?


C:\>perl -e "$t=localtime(time);print $t"
Sun Apr 14 22:50:08 1996

こんなのでどうでしょう。

C:\>perl -e "$date_n=sprintf(\"%02d%02d%02d\",(localtime(time))[5,4,3] ); print $date_n"
960314


4)マニュアルによると、UNIXファイルは、touch後にchmodコマンド で属性の変更が出来るとありますがNTではどうすればよいのですか?。


NTperlではサポートされていないようです。 #ちなみにNTFS以外のファイルパーティションに対しては、 #UNIXのようなアクセス権は設定できません。 chmod LIST LIST に含まれるファイルの、パーミッションを変更しま す。 LIST の最初の要素は、数値表現のモードでなけれ ばなりません。 変更に成功したファイルの数を返します。 $cnt = chmod 0755, 'foo', 'bar'; chmod 0755, @executables; Only a subset of the standard Perl 5 Kit has been implemented, as there is usually no direct equivalent of the functionality in Windows NT. Any functions marked with '**' will NOT warn that they are not implemented. Providing this 'warn facility' would require changes to the Perl 5 UNIX Distribution. Following are the unsupported functions: Unsupported filesystem routines =============================== chmod()**


5)新規データファイルの作成方法を教えてください。(0バイト ファイル)


ラクダ本の320ページをご覧ください。 truncate('FILE',0); あるいは local(*ZERO); open(ZERO,'>FILE') && close(ZERO);


6)PerlからCのEXEファイルはCALL出来ませんか?


perlfunc.htmlを参照して下さい。 exec/system関数でいいのではないでしょうか。 system LIST "exec LIST" とほとんど同じですが、まず fork を行ない、 親プロセスではチャイルドプロセスが終了するのを wait します。 exec の項で述べたように、引数の処理は、引 数の数によって異なることに注意してください。 返却値 は、_w_a_i_t() が返すプログラムの exit 状態です。 実際 の exit 値を得るには 256 で割ってください。 このド キュメントの exec の項も参照してください。 exec LIST exec() 関数は、システムのコマンドを実行し、戻っては きません。 戻って欲しい場合には、system() 関数を使 ってください。 LIST に複数の引数がある場合か、LIST が複数の値を持つ 配列の場合には、LIST の引数を使って、execvp(3) を呼 び出します。 1 つのスカラ引数のみの場合には、その引 数からシェルのメタ文字をチェックします。 もし、メタ 文字があれば、引数全体を /bin/sh -c に渡して解析させ ます。 もし、なければ、その引数を単語に分け、より効 率的な execvp() に直接、渡します。 注: exec() (と system())は出力バッファをフラッシュしませんので、 出力をなくしたくなければ、$| を設定する必要があるか もしれません。 例: exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq"; 第一引数に指定するものを本当に実行したいが、実行する プログラムに対して別の名前を教えたい場合には、LIST の前に、「間接オブジェクト」(コンマなし) として、実 際に実行したいプログラムを指定することができます。 (これによって、LIST に単一のスカラしかなくても、複数 値のリストであるように、LIST の解釈を行ないます。) 例: $shell = '/bin/csh'; exec $shell '-sh'; # login シェルの振りをする あるいは、より直接的に、 exec {'/bin/csh'} '-sh'; # login シェルの振りをする また、NTperl特殊関数として、こんなのもあります。 NT::Spawn COMMAND, ARGS, PID Spawns a new process using the supplied COMMAND, passing in arguments in the string ARGS. The pid of the new process is stored in PID.

ご意見、ご要望、ご質問は、 電子メールまたは 質問にお願い致します。
ホームページへ戻る。