如何使用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;
答案 0 :(得分:4)
请记住你在这里做的事情 - 你打开一个文件阅读,一次读一行。
当您在流程中修改该文件时,认为将会发生什么?
还有一些限制 - 无论如何Windows都不支持并发打开读/写。
但请具体看一下open
:
您可以在
+
或>
前放置<
,表示您希望对文件进行读写访问;因此+<
几乎总是首选读/写更新 -+>
模式首先会破坏文件。 您通常不能使用读写模式来更新文本文件,因为它们具有可变长度的记录。请参阅perlrun中的-i开关以获得更好的方法。创建的文件的权限为0666,由进程的umask值修改。
我建议改为 - 不要从同一个文件中读取和写入。重命名一个,执行您的流程,验证它是否正常工作,然后然后整理。
这样部分成功并不意味着数据损坏。
您可以使用-i
标记 - 请参阅perlrun
- 这样您就可以按照sed
的惯例进行编辑。 (可以通过$^I
在程序中使用 - 请参阅perlvar
)
虽然这样做有一些限制 - 特别是只有 才能使用while ( <> ) {
构造。实际上,我认为在更简单的程序之外这不是一个好的选择 - 它隐含地做了一些事情,所以对于未来的读者来说可能并不完全清楚,并且它与开放和重命名基本相同。