3)Perl 5でlocaltime()を使って
YYMMDD形式にするにはどうしたらいいのでしょうか?
4)マニュアルによると、UNIXファイルは、touch後にchmodコマンド
で属性の変更が出来るとありますがNTではどうすればよいのですか?。
5)新規データファイルの作成方法を教えてください。(0バイト ファイル)
7)ホームページを作成中ですが、perlで組んだCGIプログラムから
Document contains no data というエラ
ーメッセージが返ってきます。
8)サーバ上でperlスクリプトからファイルのパーミッションを変更するchmodを実行すると問題なくできるのですが、ブラウザからCGIで同じperlスクリプトを使って、
サーバにあるファイルのパーミッションを変更しようとしてもうまくいきません。
9)ファイルを新規作成するCGIスクリプトを書いたのですが、
CGIではファイルを作成できません。コマンドラインでは
問題なく動くのですが、アクセス権限の
問題なのでしょうか?
13)perlのCGIプログラムをテストするにはどのようにすればいいのでしょうか?
14)perlのプログラムは何に書けばいいのでしょうか? メモ帳なんかでもよいのでしょうか?(Winodws)
16)Windows95ではPerlは不可能なのでしょうか?
どの初心者用の本も、UNIXを前提にしています。
可能であれば、何を準備すればいいのでしょう。
18)WindowsでPerlを使おうとしています。書籍等に #!/usr/lib/perlとか出ていますが、この意味がわからないのです。 教えてください。
19)HTMLを出力するのに print "<BODY BGCOLOR="#00ff00">\n"; などとすると#以降が出力されず、文法エラー になってしまいます。どうしたらいいのでしょうか。
20)日本語のPerlメーリングリストありましたら紹介してください。
22) Part2−情報源の 2-3)らくだ本やラマ本・・・の意味を教えてください。
23) MS-Windowsにperlをインストール後、インストールの確認をするためバージョン情報を出そうと perl -v と入力しても、エラーメッセージらしきものが出てすぐに消えてしまいます。
24) MS-WindowsでMS-DOSプロンプトのコマンドラインからスクリプトを実行しようとしたのですが、うまくいきません。
25) Perlの初心者です。何から手をつければ良いのかわかりません。
27) 加入しているブロバイダ(ISP)ではtelnetを開放していないので、Perlのバージョン確認ができません。
29) 「コマンドラインから入力する」という記述がありますが、コマンドラインとは何のことですか。
30) PerlのFAQやサンプル文、関数の機能、モジュールの使い方等を調べたいのですが、何が参考になりますか。
31) WindowsでCPANモジュールを初めて使ったのですが、gzipやtar等の位置を質問されてきました。どのように対応すればよいのでしょうか。
perl -MCPAN -e shell
tarやgzip、makeの代用品であるdmake/nmakeは通常Windowsには入っていませんので別途入手する必要があります。但し、中にはコンパイラを必要とするモジュールもあるので、MS-WindowsであればActivePerlのppmユーティリティを利用するほうが無難です。
【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プロンプトで
まず、添付ドキュメントを調べてみましょう。 MS-Windowsであれば、(PerlをC:\perlにインストールした場合) エクスプローラでC:\perl\htmlフォルダをクリックしておき、 エクスプローラ→ツール→検索→名前と場所→含まれる文字列 に、調べたい文字を入力するといろいろ検索してくれます。
MS-Windowsだと、MS-DOSプロンプト(俗称DOS窓)やコマンドプロンプトで、カーソルが点滅している入力待ちの行のことです。
その記述はUNIXをベースとした場合の記述と思われます。Linux等では、デフォルトだと[Ctrl+d]にEOF(End Of File:ファイルの終わりを示す)がマッピングされています。MS-DOSでは、下記のように[Ctrl+z]がEOFにマッピングされていますので、[Ctrl+z]を代わりに使えばその後に「hello」と表示されるはずです。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
通常、プロバイダの問い合わせ窓口で確認してもらえるはずです。その程度の回答ができないようなレベルのプロバイダだと、引越をお勧めします。当面居留せざるをえない場合、以下のようなスクリプトで確認できるはずです。但し、これらはサーバの内部情報を表示するため、確認後直ちに削除した方がよいでしょう。 (UNIX系でperlが/usr/binにある場合の例)
$usr_bin_perl\n"; # print "/usr/local/bin/perl -v output =
$usr_local_bin_perl\n"; # print "/usr/local/bin/perl5 -v output =
$usr_local_bin_perl5\n"; print "\n"; -------------8<------------8<--------------------
・UNIX系のsh系シェルを使って/usr/bin /usr/local/binを検索する例
$found\n"; print "\n"; -------------8<------------8<--------------------
BIGLOBEでは、/usr/bin/perl にあるperlはPerl4となっています。そのため、Perl5から追加された関数等を使用しているとエラーになってしまいます。Perl5は、/usr/local/bin/perl5 にありますので、
各CGIスクリプトの先頭行を
#!/usr/bin/perl
から
#!/usr/bin/local/perl5
に変更する必要があります。
(1)PerlのFAQ集、特に最初の方の部分にまず目を通しましょう。
疑問に思うことの多くが、結構FAQ集に含まれてます。
FAQは以下のコマンドで参照できます。
>perldoc perlfaqMS-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
オススメ日本語メーリングリスト
まず、エラーメッセージの内容をチェックします。
例)
【症状】
・MS-DOSプロンプトで「コマンドまたはファイル名が違います」というメッセージが出る時:
【原因】
perl実行プログラムのパスがうまく設定されていないためと考えられます。
【対応策】
autoexec.bat(Win95/98)、コンパネのシステム(NT)、のパス環境変数%PATH%
を正しく設定します(UNIX系なら#!行)。
perl実行プログラムのパスが通っているかどうかは以下で確認できます。
C:\> perl -v
【症状】 #!/usr/bin/perl print "hello,world!\n";という内容のhello.plファイルを、perl.exeをインストールしたC:\perl\binに置いておき、MS DOSプロンプトでC:\WINDOWSディレクトリから
C:\WINDOWS>perl hello.pl
としても、通常エラーとなります。
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.がオススメではないでしょうか。
おそらく、下記のようなメッセージが現れていると思います。
対策は、MS-Windows95/98の場合、 スタート→プログラム→MS‐DOSプロンプト等で「MS‐DOSプロンプト」を開くことです。この時左上のタイトルはMS‐DOSプロンプトとなってるはずです。ここで、
ソフトバンク社発行の「Perlプログラミング」 原著:Programing Perlをラクダ本、 「はじめてのPerl」同:Learning Perlをラマ本といいます。 由来は原著発行元のオライリー社が表紙絵にそれぞれラクダ、ラマを 使っていることにあります。
この項はJinko Tsujinagaさんのご協力を頂きました。 ありがとうございました。
print "<BODY BGCOLOR="#00ff00">\n";などとすると#以降が出力されず、文法エラー になってしまいます。どうしたらいいのでしょうか。
print "<BODY BGCOLOR=" #00ff00 ">\n";のように分けてみるとよくわかると思います。 当然 "<BODY BGCOLOR=" は文字列として認識されますが、#00ff00以降は コメントとして認識されてしまいます。
print "<BODY BGCOLOR=\"#00ff00\">\n";#あるいは下記でもいけるかもしれません..。
print qq$<BODY BGCOLOR="#00ff00">\n$;
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.のように出るはずです。
C:\hoge>perl hoge.txt [hogehoge(引数)]
(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 を 意訳したものです。
open(INOUT, "+>hoge.txt") ; print INOUT "hellow world\n"; close(INOUT);
#!/usr/bin/perl chmod 0666,"hoge.dat";これで、誰でもアクセスできるようになります。 でも、"hogehoge"のIDを持つhogehogeさんがこのスクリプトを実行しても hoge.datのオーナではないのでうまくいきません。
同様なことをブラウザから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(インストール時に マシンの名前を入れたもの)が実行ユーザになるようです。
#!/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");
%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が置いてあるディレクトリ名をご使用下さい。
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
こんなのでどうでしょう。
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.
ご意見、ご要望、ご質問は、
電子メールまたは
質問にお願い致します。