0

明日試験がありますが、ラボ実験のこの部分で行き詰っています。

実験: Web ページを訪れた訪問者の数を追跡し、この訪問者数を適切な見出しで表示する Perl プログラムを作成してください。

#!/usr/bin/perl
use CGI':standard';
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
print "Content-type: text/html","\n\n";
open(FILE,'<count.txt');
$count=<FILE>+1;
close(FILE);
open(FILE,'>count.txt');
print FILE "$count";
print "This page has been viewed $count times";
close(FILE);
#print $count;

count.txtFedora で のパーミッションを 755 に変更しました。

Windows XP の XAMPP で (適切なシバン行を使用して) 実行すると、すべてのページの読み込みでカウントが正常にインクリメントされました。しかし、Fedora では実行できませんでした。残念ながら、私の試験では、Fedora で実行する必要があります。

4

2 に答える 2

3

常に使用してuse strict; use warnings;ください!そうした場合、エラー ログに次のエラーが表示されます。

Global symbol "$count" requires explicit package name

不足している を修正するmyと、エラー ログに次のエラーが記録されます。

readline() on unopened filehandle FILE
print() on unopened filehandle FILE

によって返されたエラーを確認することで、ハンドルが開いていない理由を確認できますopen

open(FILE,'<count.txt') or die "Can't open count.txt: $!\n";
open(FILE,'>count.txt') or die "Can't create count.txt: $!\n";

最初は、ファイルが存在しないと言います。2 番目は、プログラムがそこまで到達すると、許可エラーが発生します。count.txtこれは、ルート ディレクトリ ( ) にある名前のファイルにアクセスしようとしているためです/。cwd を変更するか、絶対パスを使用してください。


ところで、競合状態があります。2 つのリクエストが同時に来た場合、そのうちの 1 つだけをカウントすることになります。

 |   process 1                      process 2
 |   ----------------------------   ----------------------------
 T   Read count from the file (4)
 i   Add 1 to count (5)
 m                                  Read count from the file (4)
 e                                  Add 1 to count (5)
 |                                  Save new count to file (5)
 v   Save new count to file (5)

ロック機構を利用する必要があります。

于 2012-12-05T17:50:02.150 に答える
2

シバン ( #!) は、ファイルの最初の文字でなければなりません。

于 2012-12-05T17:23:57.680 に答える