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.