我正在尝试使用基本的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.问题所在的任何想法?
答案 0 :(得分:7)
您永远不会测试打开文件句柄的尝试是否有效。给定一个我有权读取和写入的文件,其中包含一个数字,而不是其他任何内容,代码按预期运行。如果该文件不存在则计数将始终为1
,如果它是只读的,那么它将保留在文件的任何位置。
更一般的建议:
use strict;
和use warnings;
(以及基于投诉的正确代码)open
的三个参数调用
open
文件始终为|| handle_the_error_in($!);
答案 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)
您需要关闭网页并重新打开它。只刷新页面不会增加计数。