Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

select and IO::Handle

by John M. Dlugosz (Monsignor)
on Aug 04, 2001 at 00:27 UTC ( #102146=perlquestion: print w/ replies, xml ) Need Help??
John M. Dlugosz has asked for the wisdom of the Perl Monks concerning the following question:

I was suprised to find the following
my $string; my $SH= new IO::Scalar; $SH->open (\$string); select ($SH); ## here
choked, complaing that $SH was not a reference to a glob.

Then I also found that $SH->select isn't a member, either.

Why doesn't this work? I thought IO::Handle objects were glob refs, which is why you can use print {$handle} "hello world".

Looking at IO::Scalar.pm, it seems that it's a blessed hash. It doesn't inherit from IO::Handle, even though the docs say "This class implements objects which behave just like FileHandle (or IO::Handle) objects..." is that incorrect?

Just how do you select one of these?

—John

Comment on select and IO::Handle
Select or Download Code
Re: select and IO::Handle
by danger (Priest) on Aug 04, 2001 at 01:21 UTC

    I found that using either of the tied interfaces worked as you expect (both documented in the POD's for Perl-5.004 or later):

    #!/usr/bin/perl -w use strict; use IO::Scalar; my $string; tie *OUT, 'IO::Scalar', \$string; select OUT; print "line 1\nline 2\n", "line 3\n"; select STDOUT; print "The string contains:\n$string\n"; ### OR this way: $string = ''; my $SH = IO::Scalar->new_tie(\$string); $SH->print("line 1\n"); # use the OO method print $SH "line 2\n"; # use it like a filehandle select $SH; # select it as default output handle print "line 3\n"; select STDOUT; print "The string contains:\n$string" __END__
Re: select and IO::Handle
by runrig (Abbot) on Aug 04, 2001 at 01:30 UTC
    IO::Scalar does not return an IO::Handle, it returns a blessed hash reference. The author said he tried to subclass IO::Handle, but ran into 'xxx on unopened filehandle' warnings. You have to use methods on an IO::Scalar object, unless you are using the tied interface, but then you would be using a tied filehandle/glob.

    I'm actually working on a patch for IO::Scalar so that it will return a blessed glob reference with a tied glob so that it will behave more like a real filehandle, and things that return IO::Scalar objects can be passed to things which expect filehandles. If there's a better fix, I'd be glad to hear of it :-)

    Update: IO::Scalar now returns a blessed glob reference and so the returned object behaves more like a real filehandle. However, modern perls let you open a filehandle directly to a scalar, which makes these sorts of modules obsolete.

      I was just talking to the author, too.

      A better fix: Only implement actual methods for the TIE. Also have a function to create one and return an IO::Handle to it as one call.

      While you're at it, note that WRITE method is missing.

      —John

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://102146]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (7)
As of 2014-08-23 02:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (171 votes), past polls