in reply to Re: Re: Tie::File strangeness with unshift
in thread Tie::File strangeness with unshift

914,
I noticed you are using the -T option for tainting. Is this running as a CGI? In a nutshell, taint is designed to ensure that Perl doesn't do anything externally by using information obtained externally. I don't think this is your problem, but I figured it was worth pointing out.

Ok - so you have done the first step - eliminate the possibility that you have a bad copy of Tie::File by proving that it can work. Now you need to find out what it is about your code that breaks it.

  • Trim out the fat. This includes, but is not limited to removing all print statements and things not related to the problem.
  • Run the script again - if the problem is still there, go back to the first step
  • If the problem goes away - then you have discovered that something you thought was innocuous actually wasn't - you have found your own problem.
  • If you have removed all the fat that you can possibly remove and the problem is still there - post that code - that way we can see exactly what you are seeing

    Cheers - L~R

    • Comment on Re: Re: Re: Tie::File strangeness with unshift
  • Replies are listed 'Best First'.
    Re: Re: Re: Re: Tie::File strangeness with unshift
    by u914 (Pilgrim) on May 26, 2003 at 00:34 UTC
      L~R ... thanks for taking the time with me..

      It turns out that my test code (above) does indeed reproduce the problem, but only on the server in question, not my local machine (yes, the overall script is CGI).

      The last error messages seem to be relevant too. When i run this script:

      #!/usr/bin/perl -Tw use Tie::File; use strict; my @array; my $file = "./file.txt"; my $line = "this is a really long line of text (sortof)"; tie @array, 'Tie::File', $file; unshift @array, $line; untie @array

      from the command line, i get:
      bash-2.05a$ ./tie
      Use of uninitialized value in read at /usr/lib/perl5/5.6.1/Tie/File.pm line 699, <FH> line 7. Use of uninitialized value in read at /usr/lib/perl5/5.6.1/Tie/File.pm line 699, <FH> line 7.

      Line 7 of my script is the "my @array;" declaration

      The target file is modified, but not as expected, and repeated executions of the test script don't change the file any further. I'm beginning to suspect my installation of Tie::File or Perl itself, since on my local machine this exact same script works as one would think it should.

      perl -v reports v5.6.1

        914,
        Just guessing here - try:

        tie my @array, 'Tie::File', "file.txt";

        instead of the 3 lines you had before.

        This is probably a difference in versions of Perl builds or in Tie::File. If my suggestion works - chalk it up to dumb luck - if it doesn't - try updating your Tie::File module on the server that doesn't work.

        Cheers - L~R

          Actually, the server that doesn't work was using Tie:File 0.95, whereas my local machine is using 0.93 (as well as Perl 5.6.1, just like the server)

          I uninstalled 0.95 and reinstalled w/ 0.93 just to see, same dice.

          I've made the change you suggested, and unfortunately dumb luck isn't with me. See below for the results. (the file.txt file starts out with 7 identical lines, and ends as you see)

          bash-2.05a$ vi tie bash-2.05a$ ./tie Use of uninitialized value in read at /usr/lib/perl5/5.6.1/Tie/File.pm + line 699, <FH> line 7. Use of uninitialized value in read at /usr/lib/perl5/5.6.1/Tie/File.pm + line 699, <FH> line 7. bash-2.05a$ cat file.txt this is a really long line of text (sortof) TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText TestText bash-2.05a$
          Note the complaints about line 699 of File.pm.....