http://www.perlmonks.org?node_id=1013377

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

I saw code as below by someone. Though no error reported, I'm curious whether it's right:

sub new { my $this = {}; bless $this; return $this; }

Generally we return bless {},package. It's true that an object of Perl is indeed a data structure saying a hash. Does Perl create an new area for the object returned by bless? Does this new sub correct acctually?

Replies are listed 'Best First'.
Re: Does this ctor make sense?
by Athanasius (Archbishop) on Jan 15, 2013 at 12:32 UTC

    From bless:

    bless REF,CLASSNAME
    ...
    If CLASSNAME is omitted, the current package is used.

    This works OK where there is no inheritance. But (from the same doc):

    Always use the two-argument version if a derived class might inherit the function doing the blessing.

    Otherwise, the derived class object will be blessed into the wrong class.

    Update: If you have access to the Camel Book, see especially the section “Object Construction” in Chapter 12, pages 424–9 (4th Edition, 2012).

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: Does this ctor make sense?
by choroba (Cardinal) on Jan 15, 2013 at 12:36 UTC
    Read the documentation: bless. The bless function does not need the package, it defaults to the current one (might get problematic with inheritance involved). The function returnes the blessed reference for convenience, but you are free to behave inconveniently, i.e. throw the return value away and return the object yourself.

    Perl does not create a new area for the object. The reference you blessed to a pakcage just knows from now on it belongs to a class.

    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      No, I'm not talking about the package. I know the Package can be omitted. I'm just not sure whether the returned blessed Hash reference is the same thing with the object returned by bless, which should be the return value of new.
        If I understand your question right, you are asking about something like this:
        my $this = bless $other, "ClassName";
        and, you want to know if "$this" is the same as "$other".

        From "perldoc -f bless",
           ...it returns the reference for convenience

        So - Yes - it is the same, and No - it is not necessary to capture the returned object from 'bless'.

                     Most people believe that if it ain't broke, don't fix it.
                Engineers believe that if it ain't broke, it doesn't have enough features yet.

Re: Does this ctor make sense?
by theshz (Sexton) on Jan 15, 2013 at 17:56 UTC
    I think the OP's question is whether he needs to capture the result of bless and return that. In other words, does "bless" actually change the reference. This was explained well in the book "Object Oriented Perl", bless does change the referant, so you do not need to capture the result. You can use ref to inspect the reference:
    my $this = {}; print ref $this; # prints HASH bless $this; print ref $this; # prints main, or Foo if you used: bless $this, FOO
Re: Does this ctor make sense?
by Anonymous Monk on Jan 15, 2013 at 12:34 UTC
    What does Data::Dumper tell you?
      Sorry I didn't know Data::Dumper, does it tell me more than simple print?

        Yes, and it’s a core module, so if you have Perl, you already have Data::Dumper:

        #! perl use strict; use warnings; use Data::Dumper; my %families = ( Flintstone => { husband => 'Fred', wife => 'Wilma', daughter => 'Pebbles', }, Rubble => { husband => 'Barney', wife => 'Betty', son => 'Bamm-Bamm', }, ); print Dumper(\%families), "\n";

        To get similar output with print alone, you would need to write your own loops.

        I didn't know Data::Dumper

        Seriously, get to know it as soon as possible, it’ll save you a lot of time. Or you might prefer one of the alternatives on , such as Data::Dump.

        Hope that helps,

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

        It tells you if the variable is blessed. (But so does plain ol' print)