LinuxQuestions.org
Help answer threads with 0 replies.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices



Reply
 
Search this Thread
Old 07-28-2008, 08:34 AM   #1
gaynut
LQ Newbie
 
Registered: Jan 2008
Posts: 27

Rep: Reputation: 15
Question while loop creates a problem for a file opened in append mode for writing in PERL


Hi,

This is my code.



open (TEMP_WRITE,">>record");
while ( <TEMP_WRITE> ) {
print $_;
if ($_ =~ /India/) {
print TEMP_WRITE "\n"."british\t\tHistory"."\n";
}

}
~




I'm trying to match a string "India" in the file record and once matched appending a new line with a data "shiju history".

This is only an example. My intention is to match a string and when found add a new data on the next line to the matched string.
In the above example, if the file "record" had ,

India History
China Wonders
Australia Cricket


On matching "India", a new line should be appended as

India History
British history.
and the rest...


Problem: The while loop to read the lines of the file works only for "reading" and not for writing/appending. The lines are not read at all.The output is blank for the above code.

Opening read mode with 1 more file handler and directing the output to another file is one solution. But is there no way , i can write into a file directly after reading????

Ur replies are highly appreciated.


Thanks,
~ gaynut
 
Old 07-28-2008, 01:39 PM   #2
Su-Shee
Member
 
Registered: Sep 2007
Location: Berlin
Distribution: Slackware
Posts: 509

Rep: Reputation: 41
If a file is opened to append to it, the file descriptor sits on the end of the file waiting for your data to be appended. (At least I think this is the case, I may be wrong.)

You'll have to seek (perldoc -f seek) back to the beginning of the file - but you really don't want to do this.

I strongly recommend not writing on the same data you're reading from - open the file for reading, put it into some convenient data structure - wether array or a scalar depends on what your're going to do - change it in there and write afterwards the entire text.

open($fh_read, "<yourfile");

make an array to add stuff linewise:

@all_lines = <$fh_read>;

or put all in one scalar (sometimes _very_ useful, especially with reg ex flags like s///sm <--):

Code:
{
    local $/; #enable slurp mode - see perldoc perlvar for details
    $all_lines = <$fh_read>;
}
Now use your loop, change the data and _afterwards_ write it to the file - override brutally it if you're confident or copy first and write a new one.

Last edited by Su-Shee; 07-28-2008 at 01:40 PM.
 
Old 07-28-2008, 08:26 PM   #3
chrism01
Guru
 
Registered: Aug 2004
Location: Sydney
Distribution: Centos 6.6, Centos 5.10
Posts: 16,324

Rep: Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041Reputation: 2041
A (flat text) file is what you see in an editor. You can't insert a line in the middle.
You have to open for read ("<"), read line by line, write out each line to a new file and (in the write loop) add any extra lines you want to add.

If you have a small enough file (ie fits easily into memory) you can read the whole file into an array and work your way through that.
In that case, you could close the file for input and re-open for output, thereby overwriting it. Be sure you have a backup first whilst testing(!).

Example read into an array:
Code:
    open( REQ_FILE, "<$infile_name" ) or
                exit_with_error("Unable to open file: $infile_name: $!\n");
    @file_recs = <REQ_FILE>;
    chomp(@file_recs);      # remove newline chars
    close(REQ_FILE) or
                exit_with_error("Unable to close file: $infile_name: $!\n");
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Perl] append to new file noir911 Programming 5 02-08-2007 07:38 AM
[Perl] append columns to file noir911 Programming 3 02-08-2007 06:29 AM
Writing to a file in Kernel Mode Caliber Programming 2 04-19-2005 10:08 AM
problem with writing into a file using socket(perl) akaash Programming 3 04-08-2004 07:06 AM
cgi perl : I cant get perl to append my html file... the_y_man Programming 3 03-22-2004 06:07 AM


All times are GMT -5. The time now is 06:24 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration