PERL CGI计划

时间:2011-11-24 19:09:06

标签: perl cgi

我正在尝试使用基本的Perl / CGI脚本来跟踪访问网页的访问者。 Perl代码如下所示:

#!/usr/bin/perl
#KEEPING COUNT OF VISITORS IN A FILE
use CGI':standard';
print "content-type:text/html\n\n";
#opening file in read mode
open (FILE,"<count.dat");
$cnt= <FILE>;
close(FILE);
$cnt=$cnt+1;
#opening file to write
open(FILE,">count.dat");
print FILE $cnt;
close(FILE);
print "Visitor count: $cnt";

问题是网页不会增加每次刷新的访问者数量。计数保持在$ cnt的初始值,即1.问题所在的任何想法?

5 个答案:

答案 0 :(得分:7)

您永远不会测试打开文件句柄的尝试是否有效。给定一个我有权读取和写入的文件,其中包含一个数字,而不是其他任何内容,代码按预期运行。如果该文件不存在则计数将始终为1,如果它是只读的,那么它将保留在文件的任何位置。

更一般的建议:

  • use strict;use warnings;(以及基于投诉的正确代码)
  • 根据the first example in the documentation
  • 使用对open的三个参数调用
  • open文件始终为|| handle_the_error_in($!);
  • 不要使用文件来存储这样的数据,你有潜在的竞争条件。
  • 获取the name of the language正确

答案 1 :(得分:3)

这是一个只使用一个open()的替代解决方案,如果该文件尚不存在,则创建该文件。锁定消除了多个更新者之间的潜在竞争条件。

#!/usr/bin/env perl
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
my $file = 'mycount';
sysopen(my $fh, $file, O_RDWR|O_CREAT) or die "Can't open '$file' $!\n";
flock($fh, LOCK_EX) or die "Can't lock $file: $!\n";
my $cnt = <$fh>;
$cnt=0 unless $cnt;
$cnt++;
seek $fh, 0, 0;
print ${fh} $cnt;
close $fh or die "Can't close $file: $\n";
print "Visitor count: $cnt\n";

答案 2 :(得分:1)

一些可能的原因:

  • 'count.dat'未被open读取。始终至少使用or die $!;进行测试,以检查文件是否已打开

  • 代码未被执行,您认为它是

答案 3 :(得分:1)

您最不明显的事情是更改文件count.dat的权限 这样做:

sudo chmod 777 count.dat

应该做的伎俩

答案 4 :(得分:-1)

您需要关闭网页并重新打开它。只刷新页面不会增加计数。