Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Pass object to subroutine.

by tacoking92 (Novice)
on Nov 15, 2011 at 18:55 UTC ( #938236=perlquestion: print w/replies, xml ) Need Help??
tacoking92 has asked for the wisdom of the Perl Monks concerning the following question:

Hi all, first post here. Hopefully someone can help me figure out my little problem I'm fighting with.

I'm attempting to pass an Net::OpenSSH object between subroutines and I'm finding it pretty difficult to do.

Here's what I'm trying.
my $ssh = login($user, $pass, $host); test(\$ssh); sub login { ($user, $pass, $host) = @_; my $ssh = Net::OpenSSH -> new($host, user=>$user, password=> $pass); return $ssh; } sub test { $ssh2 = shift; $output = $ssh2 -> capture("ls /tmp"); print $output; }

I get the following error: "Can't call method "capture" on unblessed reference at ./"

Is there a way I can pass the object reference between the subroutines?

Thanks for the help.

Replies are listed 'Best First'.
Re: Pass object to subroutine.
by MidLifeXis (Monsignor) on Nov 15, 2011 at 19:01 UTC
    my $ssh = login($user, $pass, $host); test(\$ssh);

    $ssh is already a blessed reference. If you pass it to test() like test(\$ssh), you are passing an unblessed reference to a blessed reference. You should pass it to test like test($ssh).

    Update: See also


Re: Pass object to subroutine.
by mrstlee (Beadle) on Nov 15, 2011 at 22:09 UTC
    Try this to see the difference between $ssh & \$ssh:
    use Data::Dumper; my $ssh = login($user, $pass, $host); print Dumper $ssh; print Dumper \$ssh;

    Objects in perl are often, but not always, references to a hash that has been "bless"ed into a particular namespace. In this case Net::OpenSSH->new returns a reference to a hash. In fact you can bless any reference - array refs, scalar refs, even sub-routine refs

    It's easy to create your own blessed references

    use Data::Dumper; my $obj_ref = bless {} , 'Any::Old::Perl::Identifier'; sub Any::Old::Perl::Identifier::make_hay{ my ($self) = @_; $self->{'foo'} = 'hay'; } $obj_ref->make_hay(); print ref $obj_ref, "\n"; print ref \$obj_ref, "\n"; print Dumper $obj_ref;
    Any::Old::Perl::Identifier REF $VAR1 = bless( { 'foo' => 'hay' }, 'Any::Old::Perl::Identifier' );
    You can see that the obj_ref has made hay.

    Refs can be a bit confusing. Try the perlreftut tutorial in the core perl documentation.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://938236]
Approved by ww
[choroba]: Doesn't vertical bar work in MSWin?
[RonW]: Why not ytdl >data then ffmpeg <data ?
[RonW]: (I use Windows as little as possible)
[LanX]: RonW: yes I think something like inline::Rperl would be great, but Will is AFAIK not interested to go that way
[james28909]: well now i am using a for /f delims= %i IN(yt-dl) do set var=%i & ffmpeg -i "%var%" -a:c mp3 output.mp3 & set var=

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (10)
As of 2017-05-22 21:17 GMT
Find Nodes?
    Voting Booth?