如何使用perl读取,写入,附加输入文件

时间:2015-07-21 10:14:30

标签: perl overwrite

如何使用perl读取和覆盖相同的输入文件?

我的意见:

GCGCCACTGCACTCCAGCCTGGGCGACAGAGC (873 TO 904)   GCTCTGTCGCCCAGGCTGGAGTGCAGTGGCGC (3033 TO 3064)
CAAAAAAAAAAAAAAAAAAA (917 TO 936)   TTTTTTTTTTTTTTTTTTTG (2998 TO 3017)
AAAAAAAAAAAAAAAAAAAG (922 TO 941)   CTTTTTTTTTTTTTTTTTTT (2997 TO 3016)

我尝试了以下代码:

#!/usr/local/bin/perl 
open($in,'<',"/home/httpd/cgi-bin/exa.txt") || die("error");
open($out,'>>',"/home/httpd/cgi-bin/exa.txt")||die("error");
while(<$in>)
{

print $out;
}
close $in;
close $out;

1 个答案:

答案 0 :(得分:4)

请记住你在这里做的事情 - 你打开一个文件阅读,一次读一行。

当您在流程中修改该文件时,认为将会发生什么?

还有一些限制 - 无论如何Windows都不支持并发打开读/写。

但请具体看一下open

  

您可以在+>前放置<,表示您希望对文件进行读写访问;因此+<几乎总是首选读/写更新 - +>模式首先会破坏文件。 您通常不能使用读写模式来更新文本文件,因为它们具有可变长度的记录。请参阅perlrun中的-i开关以获得更好的方法。创建的文件的权限为0666,由进程的umask值修改。

我建议改为 - 不要从同一个文件中读取和写入。重命名一个,执行您的流程,验证它是否正常工作,然后然后整理。

这样部分成功并不意味着数据损坏。

您可以使用-i标记 - 请参阅perlrun - 这样您就可以按照sed的惯例进行编辑。 (可以通过$^I在程序中使用 - 请参阅perlvar

虽然这样做有一些限制 - 特别是只有 才能使用while ( <> ) {构造。实际上,我认为在更简单的程序之外这不是一个好的选择 - 它隐含地做了一些事情,所以对于未来的读者来说可能并不完全清楚,并且它与开放和重命名基本相同。