Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

tie file and multiple record seperator

by xorl (Deacon)
on Jun 25, 2012 at 18:30 UTC ( [id://978237]=perlquestion: print w/replies, xml ) Need Help??

xorl has asked for the wisdom of the Perl Monks concerning the following question:

So I've been using Tie::File to edit a file

tie @array, 'Tie::File', "$the_dir$filename", recsep => ']', autochomp => 0;

I use the recsep => ']' because the data in the file is enclosed in brackets. Separating it on a closing bracket seemed easier than trying to figure out how to deal with the records that span multiple lines.

This all works fine except that at the end of the file are comments not enclosed in brackets. Tie:File of course adds a final closeing recsep (in this case a ']'). I really don't want it there. Short of untieing the file and reopening it and removing the final }, is there a way to easily get rid of the extra }? Is it possible to define multiple characters as the recsep (like either ']' or '/')? Am I just doing this wrong?

In case anyone needs to see the sample data in the file:

/* comment */
[record1,
     param1:value1
     param2:value2
]
[record2,
     param2:value2
]
/* end all records for 2012-06-21 */

Replies are listed 'Best First'.
Re: tie file and multiple record seperator
by choroba (Cardinal) on Jun 25, 2012 at 18:42 UTC
    The documentation of the module clearly states:
    There is no way to create a file whose trailing record separator string is missing.
    Untieing is therefore inevitable.
    Update: Have you considered truncating the file?
Re: tie file and multiple record seperator
by 2teez (Vicar) on Jun 25, 2012 at 23:30 UTC

    You could do the following to achieve your aim like so:

    tie my @array, 'Tie::File', "$the_dir$filename", recsep=>']' or die "c +an't tie file:$!"; print join ']',@array;

    Since, you have supplied a recsep as ']', and each record is delimited by it and thus not included in the array element. By not using autochomp=>0. Hence, we could insert the ']' using the join function.
    Also the last ']' in the end comments are also not included.
    Hope this helps.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://978237]
Approved by toolic
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2024-04-23 23:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found