如何解决这是标准的Perl语言构造还是自定义:open HANDLE,“> $ fname”
不是一个使用古老脚本的Perl专家遇到了一个结构,我不知道该结构不会产生我所期望的结果。好奇这是标准语言还是某种PM定制:
open FILE1,">./$disk_file" or die "Can't open file: $disk_file: $?";
从外观上看,该文件将被打开以进行写入,但是日志错误表明未找到该文件。 Perl的文件I / O需要3个参数,而不是2个。日志不具有die输出,而是说:“找不到文件”
这里有些困惑。
编辑:使用下面的答案使其起作用。好像我正在运行一个现金版本的.pl,而不是新编辑的一段时间。最终它赶上了2参数公开,谢谢大家的帮助!
解决方法
这是open的旧2参数形式。第二个参数有点神奇:
- 如果它以
'>'
开头,则该字符串的其余部分将用作打开以供写入的文件的名称 - 如果它以
'<'
开头,则字符串的其余部分用作要打开以供读取的文件的名称(如果省略' - 如果它以
'|'
结尾,则该字符串将被解释为一条命令,该命令的STDOUT连接到您的脚本将打开以读取的管道上 - 如果它以
'|'
开头,则该点之后的字符串将被解释为命令,该命令的STDIN连接到管道,您的脚本将打开以进行写入 这是一个潜在的安全漏洞,因为如果您的脚本接受文件名作为用户输入,则用户可以在开头或结尾添加'|'
来欺骗您的脚本运行命令。
(我认为)版本5.8中添加了open
的三参数形式,因此很长一段时间以来它一直是Perl的标准部分。
FILE1
部分被称为裸字文件句柄-这是全局的。现代风格是使用my $file1
之类的词汇标量。
有关详细信息,请参见perldoc perlopen,但简要地...
Perl的open()
将接受两个或三个参数(甚至有一个参数版本-从来没有人使用过)。两参数版本是较旧的样式,其中打开模式和文件名在第二个参数中结合在一起。
所以您拥有的等同于:
open FILE1,'>',"./$disk_file" or die "Can't open file: $disk_file: $?";
其他几点。
- 这些天,我们更喜欢使用词法变量作为文件句柄(因此,
open my $file1,...
而不是open FILE1,...
)。 - 我认为您会发现错误消息中的
$!
比$?
更有用。$?
包含子进程的错误,但此处没有子进程。
更新:这似乎都没有引起您所看到的问题。这似乎是由于文件实际上不在预期的位置引起的。您能否编辑问题以添加所看到的确切错误消息。
,这里的其他答案是正确的,即两个参数的语法。他们在说明为什么以及如何理想地更改它方面做得很好,所以我在这里不再赘述。
但是他们没有试图帮助您解决它,所以让我尝试一下...
这是一个猜测,但我怀疑$disk_file
包含带有路径的文件名(例如my_logs/somelog.log
),而目录部分(在我完全猜到的示例中是my_logs
)存在,因此引发错误。您可以创建该目录,也可以更改该变量的所有设置,以便将其写入确实存在的位置。
请记住,这些路径将相对于您从中运行脚本的位置-不是相对于脚本本身,因此,如果在与该目录相同的目录中有日志目录(或其他内容)您可能首先要cd
到脚本目录的脚本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。