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

While helping feanor_269 dup DATA to STDIN in the chatterbox I came up with the following code (works for me on Sun perl versions 5.004, 5.6, 5.8). The first two statements would seem to be a no-op, and yet it does not work without them.
$a = tell(DATA); seek(DATA,$a,0); open(STDIN, "<&DATA"); while(<STDIN>){ print "STDIN: $_"; } __DATA__ Foo Bar Quux
Luckily my initial code was this, else I might not have hit upon that.
while(<DATA>){ print "DATA: $_"; } seek(DATA,0,0); open(STDIN, "<&DATA"); while(<STDIN>){ print "STDIN: $_"; } __DATA__ Foo Bar Quux
Does anybody have an explanation for what's going on with that first snippet?

--
I'm not belgian but I play one on TV.

Replies are listed 'Best First'.
Re: Dup oddity OR Is it cargo cult if you wrote it yourself?
by BrowserUk (Patriarch) on Apr 01, 2003 at 01:54 UTC

    Not sure how useful this is but under AS 5.6.1 and 5.8 the seek & tell don't seem to be necessary.

    Totally speculation: Could this be a useperlio thing. This is undef in both the AS builds.

    C:\test>type test.pl #$a = tell(DATA); #seek(DATA,$a,0); open(STDIN, "<&DATA"); while(<STDIN>){ print "STDIN: $_"; } __DATA__ Foo Bar Quux C:\test>test STDIN: Foo STDIN: Bar STDIN: Quux C:\test>copy test.pl test.pl8 1 file(s) copied. C:\test>test.pl8 STDIN: Foo STDIN: Bar STDIN: Quux C:\test>

    Examine what is said, not who speaks.
    1) When a distinguished but elderly scientist states that something is possible, he is almost certainly right. When he states that something is impossible, he is very probably wrong.
    2) The only way of discovering the limits of the possible is to venture a little way past them into the impossible
    3) Any sufficiently advanced technology is indistinguishable from magic.
    Arthur C. Clarke.
      I doubt it. My 5.8 build of perl on the Sun is with perlio, but the 5.6 is not, and perlio wasn't in 5.004

      --
      I'm not belgian but I play one on TV.

Re: Dup oddity OR Is it cargo cult if you wrote it yourself?
by Aragorn (Curate) on Apr 01, 2003 at 09:08 UTC
    This is very weird. Using 5.8.0 (useperlio=defined) and 5.005 (useperlio=undef) on FreeBSD, the first snippet doesn't do anything. The second, however, works. Some playing around with filehandle duplication and copying (using the <&=FILEHANDLE construction) got me something that does work:
    close(STDIN); open(STDIN, "<&=DATA"); while(<STDIN>){ print "STDIN: $_"; } __DATA__ Foo Bar Quux
    Of course this doesn't help explaining the problem, but it adds a rather strange case to it. Time for some pondering.

    Arjen