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

Hello,
I ran into a problem when shifting records from a tied array by a parent process, which have been written by one of it's children.

The first shift is o.k. The next shift after a few seconds shows a lot of 00-bytes in front of the record.
Following shifts will have the amount of 00-bytes added, so the records grow and grow ....

I'am using:
tie @array, Tie::File, memory => 0, recsep => "MyRecSep" ..
For Test only: If shifting is performed within the child process, everything is o.k.

Thanks in advance

la_t_sys

janitored by ybiC: Balanced <code> tags around code snippet</small

Replies are listed 'Best First'.
Re: shift on a tied array leads to strange results
by Corion (Patriarch) on Mar 02, 2005 at 08:29 UTC

    I don't think that Tie::File expects the file to be changed while it is tied to an array. Tie::File builds an index of the lines in the file, and if the file is changed, the index won't be updated until the tie is broken and renewed.

    If you need need interprocess communication, consider one of the alternatives (for example discussed in perldoc perlipc, or File::Tail, or creating new files for each item of information.

Re: shift on a tied array leads to strange results
by BrowserUk (Patriarch) on Mar 02, 2005 at 09:51 UTC

    I cannot reproduce your problem. Using the following code:

    #! perl -slw use strict; use Tie::File; my @array; tie @array, 'Tie::File', 'junk.dat', memory => 0, recsep => "\t"; print shift @array while @array;

    and data (and several variations of it)

    1 2 3 4 5 6 7 8 9 10

    Tie::File does exactly as expected.

    Your sample snippet doesn't compile (with strict) anyway. The Tie::File should be in quotes and you have completely omitted the name fo the file. I suspect that if you added use strict, you might find the source of your problems.

    However, they could be just a transcription errors, so I'd suggest you produce a cut down version of your program (with strict), just enough to demonstrate the problem, and post that.


    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.
      Sorry for answering so late
      but I had to work on another urgend task.

      You're rigtht, I only posted an example code part, because I'm not used to editing text this way. Anyhow, if I use the code you have shown above, there are no problems (That's what I meant in my 'Test' statement).
      It seems to be a problem of using Tie::File for IPC, because I thought, this might be a simple form of a persistent FIFO for complex ASCII-messages.

        As Corion pointed out, Tie::File is not designed for concurrent access by multiple processes. It builds an index to the lines of the file in memory as it traverses the file and uses that index to find the lines if it has to revisit them. Shifting a line from the front of the file causes the entire file to be rewritten.

        If one process rewrites the file, the index held by the other process will be conpletely invalidated.

        Basically, "Don;t do that!".

        If you would care to describe the problem you are trying to solve (probably as a new question), then you will probably get good suggestions as to modules or code with which to solve it.


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        Lingua non convalesco, consenesco et abolesco.
        Rule 1 has a caveat! -- Who broke the cabal?