Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: Is reference blessed?

by jeroenes (Priest)
on Nov 23, 2001 at 14:58 UTC ( #127082=note: print w/replies, xml ) Need Help??

in reply to Is reference blessed?

Yes you can find out whether an object is blessed more elegantly (tye and merlyn told me): if UNIVERSAL::isa($ref,'can'){

And as for your type finding, this is from perldoc perlobj:

`isa' returns true if its object is blessed into a subclass of `CLASS' `isa' is also exportable and can be called as a sub with two arguments. This allows the ability to check what a reference points to. Example:
if(UNIVERSAL::isa($ref, 'ARRAY')) {...


"We are not alone"(FZ)

Update: Yeah I screwed up remembering tye's solution. I looked it up (mea culpa):
Is the beast you are looking for.

Update2: D'oh. I took it for granted that you wanted a ref-check anyway, like if( ref $r ){ if ($r->can('isa')){.... Your UNIVERSAL::can($r, 'isa') sounds really neat. I'm curiously awaiting tye's/ merlyn's response(s).

Replies are listed 'Best First'.
Re: Re: Is reference blessed?
by gildir (Pilgrim) on Nov 23, 2001 at 15:29 UTC
    I think it should be
    if (UNIVERSAL::can($ref,'isa')) { ...
    But I see the point now.
    As UNIVERSAL is the parent of every object (blessed reference) and it implements method 'isa', every beast that know how to call isa method must be an object.

    Update: No, $r->can('isa') won't work (as I mentioned in the other reply) because if $r is not blessed, it will die on 'unblessed reference' error. UNIVERSAL::can($r,'isa') is real solution.

    Update2: Even if I do refcheck, situation is the same. I just cannot call any method on non-blessed reference, not even the can() method. Consider $r={}; you cannot do $r->can() because $r is not blessed. And that is what I want to know, if $r is blessed or not. I know that it is a reference. Catching a die exception with eval is TIMTOWDI, but it does not look good to me :-)

      The problem with just UNIVERSAL::can($ref,'isa') is that it can return a true value when $ref isn't even a reference. So you really have to make multiple tests:

      if( ! ref($r) ) { # no reference at all } elsif( ! UNIVERSAL::can($r,'can') ) { # unblessed ref } else { # blessed ref }
      or just:
      if( ref($r) && UNIVERSAL::can($r,'can') ) { # blessed ref }
      if( ref($r) && eval { $r->can('can') } ) { # blessed ref }
      and I can't make a convincing case for one style over the other at the moment.

      And, yes, it would be nice if there were less overloaded versions of these things so that blessed returned the package that a reference was blessed into and ref just always returned the type of thing. That was a certainly a design mistake IMO.

              - tye (but my friends call me "Tye")

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://127082]
[stevieb]: I *finally* have my automated RPi::WiringPi and related distribution automated test build system done! It's easy to use (relatively), simple to set up, and works awesome! Cycles every X mins, checks github for new commits, and builds...
[stevieb]: ...optionally displaying the results to a connected LCD with the dist name, date, time and commit of the last run along with a FAIL/PASS. Obviously I can't get CI with Travis for a RPi, so I built my own :) It'll take a couple of blog posts I think...
[stevieb]: cover it all. Awesome thing is that you can dispatch ANY distribution to it (and include all revdeps if desired), and it works all the same as if I'm just testing the RPI code itself
[stevieb]: I'm rather pleased with myself and everything I've leared along this arduous and sometimes frustrating path
[stevieb]: Just need to implement an email plugin or something so I can get alerted remotely if the status of a build has changed from the last run
[stevieb]: Because of the extreme complexity of the testing code itself, I implemented extensive logging so I can troubleshoot much easier by setting a high debug level.

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (2)
As of 2017-04-28 21:44 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (529 votes). Check out past polls.