我得到了这个perl示例,它假设展示sysopen
和printf
,但到目前为止只展示了死亡。
#! /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";
....
答案 0 :(得分:11)
O_RWDR
,O_EXCL
和O_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)