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

Hi

I have the following code snippet -
sub new { my $class = shift; my $self = { name => shift, ipAddress => shift, port => shift, stuff => new MyPackage::MyStuff(), }; my @paramters = ($self); my $thread = new Thread \&processJobs, \@paramters; bless $self, $class; return $self; } sub processJobs { my $self = shift; }
But this gives my the following error -
Pseudo-hashes are deprecated at line 43. thread failed to start: Bad index while coercing array into hash at li +ne 43.
How can I pass in a reference to self so that my process can access members of my class.
Thanks you.

Replies are listed 'Best First'.
Re: Passing self to process as reference
by targetsmart (Curate) on Mar 18, 2009 at 10:10 UTC
    you are storing a hash reference to the first index on the array.
    my @paramters = ($self); my $thread = new Thread \&processJobs, \@paramters;
    And in processjobs you are expecting the hash reference
    sub processJobs { my $self = shift; }
    if my understanding on your post is correct, why can't you change line like this
    my $thread = new Thread \&processJobs, $self; and in process jobs use like this sub processJobs { my $self = $_[0]; }
    This is not an answer to your question, but I saw an un-necessary use of an intermediate array, i pointed you that.


    Vivek
    -- In accordance with the prarabdha of each, the One whose function it is to ordain makes each to act. What will not happen will never happen, whatever effort one may put forth. And what will happen will not fail to happen, however much one may seek to prevent it. This is certain. The part of wisdom therefore is to stay quiet.
      Thanks for the reply! Passing $self like this is pass by value. I wan't to pass it by reference. At the moment, updating a value in self via the main thread is not being reflected in my process because i only have a copy of self.
Re: Passing self to process as reference
by ELISHEVA (Prior) on Mar 18, 2009 at 10:27 UTC

    I tried running the code (with $self = {...} replaced by $self={} and it created the threads without the errors or warnings you report. My suspicion is that some of your data value are not what you think they are. The error appears to be coming from line 43 because the Thread module uses Carp, but it is actually coming from inside new when it tries to work with the contents of the parameter array.

    Is this your actual code? I would try posting a slimmed down bit of code that we can run and actually shows the same warnings: including a call to your sub new with dummy data.

    Also, why do you bless $self after calling processJobs? You can't use it as an object reference until it is blessed - it won't know where to find the method "foo" in $self->foo(...)

    Best, beth

      Here's my code -
      #!/usr/bin/perl use strict; use warnings; use MyStuff::Server; my $serverPort = '17077'; my %serverDictionary; $serverDictionary{"barry"} = new MyStuff::Server("barry","localhost",1 +7070); sleep(10); # and my package - # Represents a video server package MyStuff::Server; use strict; use warnings; use Thread; sub new { my $class = shift; my $self = { name => shift, }; bless $self, $class; my @paramters = ($self); my $thread = new Thread \&processJobs, \@paramters; return $self; } sub processJobs { my $self = shift; print "Processing Jobs for Server Named: ", $self->{name},"\n"; }
      This gives the error -
      Pseudo-hashes are deprecated at line 43. Argument "barry" isn't numeric in hash element at line 43.
      Line 43 is where I print. Thanks again!

        That helped a lot. The reason you are getting a wierd result is that you need to call my $thread = new Thread \&processJobs, @paramters (omit the \ before @paramters).

        When you pass \@paramters to the Thread constructor processJobs gets \@paramters passed, as is, as the first parameter, not $self. $self is still there, just inside the array, to see this, add a print STDERR ... to your code, like this:

        sub processJobs { my $self = shift; print STDERR "$self is <@$self>\n"; #print $self print "Processing Jobs for Server Named: ", $self->{name},"\n"; }

        Best,beth

Re: Passing self to process as reference
by Anonymous Monk on Mar 18, 2009 at 09:56 UTC
    What is line 43? Are you aware Thread is for old code only?
      Thanks for your reply. No, I wasn't aware of that... what should I be using? Line 43 is the line where I call new Thread.