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

My most esteemed monks.

Here's some code:

package FileHandle::A; sub TIEHANDLE { my $self = shift ; my $fh = [ shift ]; bless \$fh => $self; } sub PRINT { my $self = shift; my @list = @_; my $fh = $$self->[0]; print $fh @list; } tie *STDOUT, 'FileHandle::A', *STDOUT; print "testing";

Basically, I was getting a Deep recursion error and I tried minimalizing the error to post here. The code I present here segfaults on my machine.

I think I know why... PRINT calls print which calls PRINT which calls print which calls... you get the idea...

I tried a bunch of things already, including CORE::print() and even passing a special parameter to stop the recursion, which indeeds stops it, but... doesn't print.

I know the example looks weird; it really isn't what I want to do, but it demonstrates my problem. Can anyone point me in a direction that solves it?

Replies are listed 'Best First'.
Re: Solving Deep recursion with a tied Filehandle
by runrig (Abbot) on Oct 14, 2005 at 16:53 UTC
    As mentioned in the CB, your code works in 5.6.1 and earlier, but not 5.8.??? However, I did get this to work in 5.8.4:
    *FH = *STDOUT; { local *STDOUT; tie *STDOUT, 'FileHandle::A', *FH; print "testing"; }
    Update: Just a note that the local above doesn't seem to do what I thought it would, that is, after the anonymous block, STDOUT is still tied (I thought it would get untied and return to it's original state). I think the correct thing would be to untie STDOUT (and maybe set it to the saved *FH) when you want the old STDOUT back. That still doesn't help cog, though :(
      If you don't want it to localize STDOUT, the following works:
      { local *TEMP = *STDOUT; undef(*STDOUT); tie *STDOUT, 'FileHandle::A', *TEMP; } print "testing";
      and so does
      { my $temp = *STDOUT; undef(*STDOUT); tie *STDOUT, 'FileHandle::A', $temp; } print "testing";

      Tested on Perl 5.6.1 and 5.8.0

        None of those work with my 5.8.7
      That doesn't segfault anymore, but neither does it print and it seems to run endlessly, while hanging my machine.

      I'm running 5.8.7.

Re: Solving Deep recursion with a tied Filehandle
by Anonymous Monk on Oct 14, 2005 at 17:00 UTC
    Don't do that