sysopen示例不起作用

时间:2012-08-31 01:39:41

标签: perl

我得到了这个perl示例,它假设展示sysopenprintf,但到目前为止只展示了死亡。

#! /usr/bin/perl  
$filepath = 'myhtml.html';
sysopen (HTML, $filepath, O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened.";
printf HTML "<html>\n";

但是当我执行代码时它只是die

myhtml.html cannot be opened. at file_handle.pl line 7.

myhtml.html不存在,但它应该由O_CREAT标志创建。不应该吗?


修改

我已编辑代码以包含有关use strict$!的建议。以下是新代码及其结果。

#! /usr/bin/perl
use strict; 
$filepath = "myhtml.html";

sysopen (HTML, '$filepath', O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened. $!";
printf HTML "<html>\n"; 
由于use strict

输出给了我们一大堆错误:

Global symbol "$filepath" requires explicit package name at file_handle.pl line 3.
Global symbol "$filepath" requires explicit package name at file_handle.pl line 5.
Bareword "O_RDWR" not allowed while "strict subs" in use at file_handle.pl line 5.
Bareword "O_EXCL" not allowed while "strict subs" in use at file_handle.pl line 5.
Bareword "O_CREAT" not allowed while "strict subs" in use at file_handle.pl line 5.
Execution of file_handle.pl aborted due to compilation errors.

编辑2

根据每个人的建议和帮助,这是最终的工作代码:

#! /usr/bin/perl
use strict;
use Fcntl;

my $filepath = "myhtml.html";

sysopen (HTML, $filepath, O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened. $!";
printf HTML "<html>\n"; 
....

3 个答案:

答案 0 :(得分:11)

O_RWDRO_EXCLO_CREAT都是Fcntl模块中定义的常量。 放行

use Fcntl;

靠近剧本顶部。

答案 1 :(得分:7)

这里有很多问题:

  • 始终将use strict;放在程序的顶部。这将提供一个线索。
  • sysopen失败的原因在$!变量中。您通常应将其包含在任何die消息中。
  • 正如sysopen中的man perlfunc条目所解释的那样,O_*模块会导出各种Fcntl常量。如果要定义那些常量,则需要use该模块。事实上,你是字符串或字符串"O_RDWR""O_EXCL""O_CREAT",导致另一个字符串sysopen不知道是什么与...有关。 use strict会阻止这种情况发生。

答案 2 :(得分:1)

myhtml.html文件可能已经存在。这可能是因为先前执行的脚本创建了它。如果文件存在,O_EXCL标志将导致sysopen失败。来自sysopen文档的相关引用:

  

在许多系统中,O_EXCL标志可用于打开文件   独家模式。这不是锁定:排他性意味着如果   该文件已存在,sysopen()失败