in reply to Passing self to process as reference

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

Replies are listed 'Best First'.
Re^2: Passing self to process as reference
by Anonymous Monk on Mar 18, 2009 at 10:48 UTC
    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

        Thanks. The problem is that I wish to pass by reference. for example -
        my @paramters = $self; my $thread = new Thread \&processJobs, @paramters; $self->{name} = "new name"; return $self; } sub processJobs { my $self = shift; while(1) { print "Processing Jobs for Server Name: ", $self->{name},"\n"; } }
        Will never print "new name". How do I pass self by reference? Thanks.