无法使用Perl写入Fedora中的文件

时间:2012-12-05 17:20:47

标签: perl file-io fedora

我明天参加考试,并坚持参加实验室实验。

实验:编写一个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;

我在Fedora中将count.txt的权限更改为755。

在每个页面加载时,计数在Windows XP中的XAMPP上执行时成功递增(具有正确的shebang行)。但是我无法在Fedora上执行它。不幸的是,在我的考试中,我必须在Fedora上执行。

2 个答案:

答案 0 :(得分: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";

第一个说文件不存在。如果程序要到那么远,第二个会给你一个权限错误。那是因为您尝试访问根目录(count.txt)中名为/的文件。更改cwd或使用绝对路径。


顺便说一句,你有一个竞争条件。如果两个请求同时进入,您最终只会计算其中一个请求。

 |   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)

您需要使用锁定机制。

答案 1 :(得分:2)

shebang(#!)必须是文件的第一个字符。