Winでのアクセスカウンター設置がうまくいかない

[上に] [前に] [次に]
野田内 周 2000/05/30(火) 10:53:14
皆様 はじめまして Niftyのフォーラムでこちらのサイトを知り、「とほほのCGI入門」で念願だった
WinでのPerl環境を構築できました。このサイトの管理者の方には本当に感謝しています。

さて、質問を1つしたいのですが、HTMLと簡単なPerl構文は読み込みOKだったのですが、自作のアクセスカウンターを作りperl -wcをしたら
下記エラーメッセージになりました。

「Can't modify not in scalar assignment at c:\www\cgi-bin\counter.cgi line2,near""conter.dat";"
c:\www\cgi-bin\counter.cgi had compilation errors.」

果たして2行目辺りのどの返がおかしいのかわかりません・・・・。

(cgi)
!#/usr/bin/perl
$datafile="counter.dat";
open(DATA,"$datafile");
$number = <DATA>;
close (DATA);
$number =$number +1 ;
open(DATA,">$datafile");
print DATA $number;
close(DATA);
print $number;

「とほほのCGI入門の最後の方に「バイナリデータを扱う場合、Windowsではopen()でオープンしたハンドルに対してbinmode()でバイナリモードに変更してやる必要があります。 」となっていますが何か関係あるのでしょうか?
もし関係しているのであればbinmode()での変更のしかたを具体的に教えて下さい。

ケンヤム 2000/05/30(火) 11:21:20
バイナリモードで開くには


open DATA, "$datafile";
binmode(DATA);
$number=$number+1;


(counter.datの内容は、数値が書いてあるだけみたいだけなので、バイナリとか関係ないように思いますが・・・。)

Fuji.♪ [E-Mail] [HomePage] 2000/05/30(火) 11:24:16
1行目の
!#/usr/bin/perl

#!/usr/bin/perl
になるんじゃないですか?

しなのむし 2000/05/30(火) 12:44:39
Win環境では、#!/usr/bin/perl の行自体、必要ないと思います。
この場合、binmode() も関係ないです。

andi 2000/05/30(火) 12:50:58
>#!/usr/bin/perl の行自体、必要ないと思います。
う〜ん!#だとコメントアウトされてないからじゃ。

ところで僕の環境だと#!/usr/bin/perlは必要です。
Win98+apache+perl5.6です。

ケンヤム 2000/05/30(火) 13:04:39
IISを使っていれば、#!/usr/bin/perlは無視されるのですけど、野田内 周さんは、どういった環境ですか?

しなのむし 2000/05/30(火) 13:07:20
>ところで僕の環境だと#!/usr/bin/perlは必要です。
>Win98+apache+perl5.6です。

ありゃ、これは、知らなかった。どうもです。
>andiさん

こういう時はやっぱり自分の環境書くべきですね。自分は

Win98
httpd 1.28d (http://www.st.rim.or.jp/~nakata/)
perl build 522 by ActiveState (http://www.ActiveState.com)

です。

2000/05/30(火) 13:30:55
> ところで僕の環境だと#!/usr/bin/perlは必要です。
> Win98+apache+perl5.6です。
いくつか疑問があるんですが。
・.exeは?
・なんで、区切り文字にスラッシュ?
・ドライブネームは?

まあ、単に「#!/usr/bin/perlにあたる記述が必要」と言ってるだけのような気もしますが。

ふじ 2000/05/30(火) 15:13:06
Windows版のApache(1.3.6 + NT4.0で確認)では、
>・.exeは?
不要です。(あってもいいけど)

>・なんで、区切り文字にスラッシュ?
スラッシュでも大丈夫。(\でもいいですが)

>・ドライブネームは?
CGIのあるドライブと同じドライブなら、省略可能です。
違うドライブなら、
#!D:/hoge/fuga/perl
とか。

C:\Perl\bin\perl.exeを使うなら、
#!/Perl/bin/perl
#!C:/Perl/bin/perl
#!C:\Perl\bin\perl.exe
等としなくてはならないので、そのままUNIXサーバに持って行きづらいのは
不便なところですが。
# C:\usr\local\bin に perlをインストールする、という手もある。

ヒソカ 2000/05/30(火) 15:23:17
Apacheでは
#!/usr/bin/perl
:
と書いた物なら
c drive に c:\usr\bin を作ってその中に
Cmd32.exe , Perl.exe , Perl***.dll を入れておけば動くはず。

で、.exeの拡張子は必要ないはず。
ディレクトリの区切りは/でないとApacheは認識しない。
ドライブ名はカレントドライブにあれば必要としない。っていうか
他のドライブとかは使えなかったはず。最近のバージョンでは?

Apacheは極力Unix環境にに近づけようとしているんでしょうね。
でも、まだ詰めが甘いんだけどね。

WinはWinと割り切るべきかも?
Unixとは造りが違うからね。

ヒソカ 2000/05/30(火) 15:31:00
↑先こされてました。

> >・なんで、区切り文字にスラッシュ?
> スラッシュでも大丈夫。(\でもいいですが)

\使えますか?
httpd.conf内では必ず/で指定するように書いてあったけど、
CGIではOKってこと?

> #!D:/hoge/fuga/perl
> とか。
使えるようになっていたんですか。

2000/05/30(火) 15:34:27
なるほど。
ついでに、もう一つ質問。
なんで、usr/bin?わざわざ作ってるんですか?何の為に?

2000/05/30(火) 15:35:55
‥‥‥なんか、どうしようもない質問をしたような気が。
答えなくていいです。

ふじ 2000/05/30(火) 15:44:47
>\使えますか?
試したら使えました。httpd.conf の中とは違うんでしょう。
別ドライブにあっても大丈夫のようです。
# NTで確認したので、95,98でどうなのかは知らない。

ヒソカ 2000/05/30(火) 16:09:51
> ‥‥‥なんか、どうしようもない質問
ヘヘヘ (^_^)

CGIの一行目が理解できない人たちはこうしないとマズイかも。
/usr/bin と /usr/local/bin 2つつくってたりして・・

> 別ドライブにあっても大丈夫のようです
Thanx > ふじさん  (あれ、なんかこうかくと登ってみたくなる。)

sadahiro 2000/05/30(火) 22:38:29
わたしの環境(win98, ActivePerl522, httpd123b)で試した所,
Fuji.♪ さん,andiさんのご意見の通りではないかと.
つまり,1行目と2行目が,コメント部分を省略すると
! $datafile="counter.dat";
となるのがよろしくないのは?

野田内 周 2000/05/31(水) 10:26:39
みなさん ありがとうございます。
ご指摘の通り、出だしの!#が逆でした。逆にしてperl -wcを実行したらokとなりました。(すいません。upする前にもうちょっと確認
しておけばよかったです。反省。m(_ _)m )
しかし、構文の方はOKだったのですが、これをHTMLで走らせてみるとカウンター数字の部分が
反映されません。

<html>
<head>
<title>アクセスカウンターテスト</title>
</head>
<body>
あなたは<!--#exec cgi="/www/cgi-bin/counter.cgi"-->番目の閲覧者です。
</body>
</html>

私の環境は、Win95・ANHTTPD・ActivePerl5.6 です。

謎の人 2000/05/31(水) 10:39:51
回答ではありません。独り言です。

Win95・ANHTTPDってSSIサポートされているのかなぁ...。

Fuji.♪ [E-Mail] [HomePage] 2000/05/31(水) 10:42:27
<!--#exec cmd="./counter.pl"--> とかではないでしょうか?<cmd=がcgi=になってますが・・・
Perlのソースファイルはなんとなく.cgiではなく.plのような気がしますがこだわりません。

あと、AnHTTPdでSSIを許可していますか?
WWWブラウザでソースを開いたときに <!--#exec cmd="〜"--> と表示されていたらSSIがokになっていません。
その辺を確認して見てください。

Fuji.♪ [E-Mail] [HomePage] 2000/05/31(水) 10:44:17
あ、一応SSI/CGIをサポートしていますよ。 (^^;>謎の人さん

http://www.st.rim.or.jp/%7Enakata/

謎の人 2000/05/31(水) 12:00:22
Fuji.♪さん、ありがとう。

野田内 周 2000/05/31(水) 17:01:51
2ヶ所変えたらできました!

<!--#exec cmd="./cgi-bin/counter.pl"-->

で走りました。

野田内 周 2000/05/31(水) 17:04:11
追:
cgiとplでどう違うのだろう・・・・・?
パスの付け方もおかしかったですね。
ありがとうございました。

野田内 周(ノタウチ マワル)

Fuji.♪ [E-Mail] [HomePage] 2000/06/01(木) 10:17:35
.plはPerlのスクリプトに、.cgiはCGIスクリプト/プログラムなどに付けるのではないでしょうか?
私はそのように使い分けていますが。

つまり、SSI式テキスト出力カウンタは、結果として数字だけを出力しますが、これはCGIスクリプトとして動かしたらエラーが帰ってくることになりますよね。(Content-typeないし)

CGIスクリプトにはPerlがたくさん使われていますが、シェルスクリプトだろうがCのプログラムだろうが、要は実行できてしっかり結果を返してくれるものなら何でもokなんですよね。
1行目に #!/usr/local/bin/perl などと書いているのは、Perlのプログラムを呼び出して以下のコードを引き渡してねってコトですから。(・・・ですよね? (^^;)
同様に、 #!/usr/bin/sh とか書けば、shのシェルスクリプトで記述できます。CGIの場合は、このように言語の制約はありません。

.plの場合、(Perlだよ、と明示しているため)内容がわかりやすいということになります。これで中身がc++のソースだったら他の人に渡すときに蹴りの一発でも食らうかもしれません。 (^^;

.cgiより.plの方が良いのではと言ったのは、SSIで呼び出して実行しているPerlのスクリプトがテキストを出力しているので、CGIスクリプトとして呼び出しているわけではないようなので.plの方が適切なのではないかなと思ったまでで、他意はありません。 (^^;

野田内 周 2000/06/01(木) 11:57:06
[[解決]]
Fujiさん 
コメントありがとうございます。
ただ僕には難しい言葉がいっぱいあって・・・・。
つまり、こういうことでしょうか。
CGIと言ってもいろいろな言語で書かれていて、たまたまこのスクリプトは
Perl言語だったので、それに合致した構文になっていなかったからエラー
になったということでしょうか。
再度じっくり読まさせて頂きます。(^^;)

営業部在籍中 野田内 周

Fuji.♪ [E-Mail] [HomePage] 2000/06/01(木) 13:07:44
そういう感じです。

要はCGIとSSIは、PerlとCGIは全然関係ないってコトです。 (^_^;

野田内 周 2000/06/01(木) 13:18:24
↑後半部分取消しします。
とほほのCGI入門にありました。こっちでやってみます。
お騒がせしました。

[上に] [前に] [次に]