找回密码
 注册
查看: 3387|回复: 0

perl语言中文件句柄的打开

[复制链接]
发表于 2011-11-13 23:01:49 | 显示全部楼层 |阅读模式
你已经见过了Perl 提供的3 种文件句柄:STDIN, STDOUT, STDERR。当需要其它的文件句柄时,使用open 操作通知Perl,
Perl 再请求操作系统来建立同外部的连接。下面是一些例子:
open CONFIG, “dino”;
open CONFIG, “<dino”;
open BEDROCK, “>fred”;
open LOG,“>>logfile”;
第一例中打开了一个名为CONFIG 的文件句柄,它指向dino 文件。也就是说,文件dino 将被打开,其所包含的数据通过
CONFIG 传给程序。这和从文件中取数据,也可以通过STDIN 得到是类似的,如果在命令行中使用了shell 重定位操作如
<dino。第二例和第一例类似;它和第一例是一样的,只是< 明确的指明了“使用这个文件进行输入操作”,虽然默认的
情况就是输入(没有<)◆。
◆这可能引起严重的安全问题。正如我们即将看到的。文件名可能使用了一些magical 字符串。如果$name 有
用户指定的文件名,打开$name 将允许这些magical characters 能执行。这对于用户可能非常方便,但其存在安全漏洞. open < $name 将
会更加安全,因为它严格指明了将打开的文件名作为输入来使用。但是,这仍不能阻止所有的问题。想了解更多的关于打开文件的信息,
特别是和安全相关的信息,可以参看perlopentut 的帮助手册。
打开文件进行输入,一般不需要使用<, 我们这里介绍的原因是,在第三例中,使用了大于号(>)来表明是文件的输出。此
例中打开文件句柄BEDROCK,输出到新文件fred 中。和shell 重定位中使用的大于号一样,我们将输出送到文件fred 中。
如果存在这样的文件,则清空它,并将新的数据写入。
第四个例子中使用了两个大于号(>>)(和shell 一样),它打开一个文件,数据追加到文件后面。也就是说,如果文件存在,
将把新数据添在后面。如果文件不存在,则和大于号(>)一样,创建文件,并把数据写入。这对于日志(log)文件是非常方
便的;程序可以每次添加写的日志到log 文件中。这也是把第四例中的文件句柄叫做LOG,文件叫做logfile 的原因。
可以在文件名的地方使用任何的标量表达式,虽然通常你可能不想这样做:
my $selected_output = “my_output”;
open LOG,“> $selected_output”;
注意大于号后面的空格。Perl 会忽略它◆,但它防止可能出现的异常情况。如,当$selected_output 为“>passwd”,则它将
变成追加。
◆是的,如果文件名前有空格,Perl 将忽略它。查看perlfunc 和perlopentut 了解更多的信息。
Perl 的新版本中(从Perl5.6 开始),open 支持“3 参数”类型:
open CONFIG, “<”, “dino”;
open BEDROCK, “>”, $file_name;
open LOG, “>>”, &logfile_name();
这种方法的优点是Perl 不会将模式(第二个参数)和文件的名字(第三个参数)混淆,这能增加安全性◆。但,如果你希
望你的程序能和早期的Perl 兼容(如上传到CPAN),则尽量避免使用这种方法,或者标明其只对5.6 版本之后的有效◆。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 21:31 , Processed in 0.027521 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表