data group
data group

Reputation: 3

How to read, write, append the input file using perl

How to read and overwrite the same input file using perl?

My input:

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

I tried the below code:

#!/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;

Upvotes: 0

Views: 515

Answers (1)

Sobrique
Sobrique

Reputation: 53478

Bear in mind what you're looking at doing here - you're opening a file for reading, reading it one line at a time.

What do you think is going to happen when you modify that file in the process?

There's also some constraints - Windows doesn't support concurrent opening for read/write anyway.

However take a look at open specifically:

You can put a + in front of the > or < to indicate that you want both read and write access to the file; thus +< is almost always preferred for read/write updates--the +> mode would clobber the file first. You can't usually use either read-write mode for updating textfiles, since they have variable-length records. See the -i switch in perlrun for a better approach. The file is created with permissions of 0666 modified by the process's umask value.

What I would suggest instead though - don't read and write from the same file at all. Rename one, execute your process, verify that it worked properly, and then tidy up afterwards.

That way a partial success won't mean corrupted data.

You can use the -i flag - see perlrun - this allows you to in place edit as you might be used to with sed. (Can be used within program via $^I - see perlvar )

There's a couple of constraints on doing this though - specifically it only works if you're using the while ( <> ) { construct. Practically speaking, I think this wouldn't be a good choice outside more simplistic programs - it's doing something implicitly, so might not be entirely clear to future readers, and it's doing essentially the same thing as opening and renaming anyway.

Upvotes: 4

Related Questions