Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Re^2: (nrd) Putting file contents into a scalar

by joe++ (Friar)
on Oct 29, 2002 at 13:47 UTC ( [id://208737]=note: print w/replies, xml ) Need Help??


in reply to Re^2: (nrd) Putting file contents into a scalar
in thread Putting file contents into a scalar

For my own code, I even prefer to use IO::File because that gives me all that neat OO stuff on the file handle. And the additional benefit to be able to test for the type of a scalar which happens to be passed to me, by checking for ref $fh eq 'IO::File'.

But that's much typing for oneliners...

Update: As merlyn correctly pointed out:

"Please don't do that. Your code is fragile. It will break when I pass an object that subclasses IO::File but acts in every way like an IO::File".
So I went through my latest and greatest module, which grossly offends against this statement, and quietly changed my test to read:
... croak("Invalid type for 'outfile', missing method print()'") unless $outfile->can('print'); ...
The immediate benefit is that I now can use IO::Scalar from my test script to get output in a variable instead of a file (or STDOUT). Cool!

--
Cheers, Joe

Replies are listed 'Best First'.
Say no to ref $thing eq "Expected::Type"
by merlyn (Sage) on Oct 29, 2002 at 14:35 UTC
    And the additional benefit to be able to test for the type of a scalar which happens to be passed to me, by checking for ref $fh eq 'IO::File'.
    Please don't do that. Your code is fragile. It will break when I pass an object that subclasses IO::File but acts in every way like an IO::File.

    Instead, write your code so that the class doesn't matter. Use the polymorphism as it was intended. If you are unsure if $object_x can handle a particular method call, then use UNIVERSAL::can against it, or put it in an eval block to trap the potential error.

    The use of ref in ordinary code should be limited to determining whether something is a reference or not (such as whether the first parameter for a method call is a class or instance). Any explicit comparison will break subclassing. Too much "navel contemplation" is a bad thing in robust code.

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.

      or use UNIVERSAL::isa() which will most easily accomplish what merlyn is talking about.

      [TINPC@perlcabal.com shh]$ su real
        No, I meant "can" specifically.

        Suppose I come up with a type that doesn't inherit from IO::File, but has all the proper behaviors of IO::File. Why should you reject it?

        All you should care is that when you send close to it, it closes. Hence, can is more appropriate than isa, almost every time.

        Or, to avoid the overhead, just drop it into an eval block.

        -- Randal L. Schwartz, Perl hacker
        Be sure to read my standard disclaimer if this is a reply.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://208737]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (6)
As of 2024-04-19 08:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found