Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Blessing with unknown classnames (updated x 2)

by LanX (Saint)
on Apr 01, 2021 at 16:44 UTC ( [id://11130678]=note: print w/replies, xml ) Need Help??


in reply to Blessing with unknown classnames

> What happens when a ref is blessed into a non-existent class. Afterall bless's 2nd argument is a string and not a package qualifier.

You don't reveal the answer on purpose?

The package/class is created.

you can check by inspecting the %main:: stash, where all packages live

DB<30> bless [1,2,3] => 'nonexistent' DB<31> p $main::{'nonexistent::'} *main::nonexistent:: DB<32>

and I think ° it's not only the typeglob but also the stash %nonexistent:: is created, which will result in several hundreds of bytes of overhead

DB<32> p *{$main::{'nonexistent::'}}{HASH} HASH(0x2e7b830) DB<33>

So better don't try to automatically bless into millions of pseudo packages ...

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

PS: According to some statistics this was my 10000st post here ... frightening.

update

°) I couldn't find a pure Perl way to check if the HASH slot of a package:: like entry is filled, without autovivifying that package. It's a very quantum-brainf*ck thing, the observation is changing the result.

Update

For clarification: using bless to solve the semipredicate problem is totally fine in my eyes.

Just be aware that the package will exist. And this globally.

So you should care about a naming convention in your own namespace.

Replies are listed 'Best First'.
Re^2: Blessing with unknown classnames
by choroba (Cardinal) on Apr 01, 2021 at 23:44 UTC
    Run
    perl -we 'bless {}, "A$_" for 1 .. 2000000'
    and what your memory meter.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      Nice,

      on my windows 10 box each package seems to eat ~1k of memory:

      perl -we "sub mem{system qq(tasklist /FI \"PID eq $$\"|findstr perl)}; + mem();bless {}, qq(A$_) for 1 .. 1000000;mem()" perl.exe 29356 Console 1 6 +.616 K perl.exe 29356 Console 1 1.353 +.656 K

      and quite the same on my Linux box:

      perl -we 'sub mem{system qq(cat /proc/$$/status | grep ^VmSize)}; mem( +);bless {}, qq(A$_) for 1 .. 1000000;mem()' VmSize: 23768 kB VmSize: 1234168 kB

      Obviously the package is empty..

      perl -MDevel::Symdump -e "bless {},'notexisting';print Devel::Symdump- +>new('noexisting')->as_string" arrays functions hashes ios packages scalars unknowns

      ..holding just the AUTOLOAD

      use strict; use warnings; my %before = %main::; bless {},'nonexistent'; my %after = %main::; foreach my $symbol (sort keys %after) { next if exists $before{$symbol}; local *myglob = $after{$symbol}; if ( defined *myglob{HASH} ) { my %val = %{ *myglob{HASH} }; print "HASH \%$symbol = ( "; while( my ($key, $val) = each %val ) { print "$key=>'$val', "; } print ")\n" ; } } __END__ HASH %nonexistent:: = ( AUTOLOAD=>'*nonexistent::AUTOLOAD', )

      ..but: For various obscure reasons, typeglobs are always created with a Null SV in the SCALAR slot.

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
        It doesn't matter if the package is empty, a STASH was created to hold the symbols.

        And the initial overhead for a hash is profound, even if it's empty. Like I said several hundreds of bytes.

        Furthermore do I remember someone explaining that packages which become classes receive further optimization. In order to speed up method lookup (IIRC), but I don't really know the details..

        I'm not aware of any application which tries to generate a massive amount of pseudo packages, I'm just saying it might not be the best idea to create many global data structures which are never destroyed.

        And if you only generate a small number, take care about controlling the namespace, because they are global.

        Fun fact: As a side effect of my experiments I was even able to block a package name in a way that any further package blocked_name; would globally fail.

        Like: "Hey I hate Moose, if you use my module in your project you won't be able to ever use Moose later!" ;-)

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

        > ..holding just the AUTOLOAD

        hmm interesting ... it's only the scalar $AUTOLOAD which is created and not any sub &AUTOLOAD

        And the value is undef

        I'd say that's only a random side-effect (probably bug), there is no use of $AUTOLOAD without &AUTOLOAD

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-19 11:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found