in reply to Re^2: calling sub with object as param
in thread calling sub with object as param

hello, thank you for your quick response , can you please give some sample code so that i can better understand what you mean ? i am just starting to learn perl.

Replies are listed 'Best First'.
Re^4: calling sub with object as param
by Athanasius (Archbishop) on Sep 03, 2015 at 06:47 UTC

    Hello perlnewb4life, and welcome to the Monastery!

    Anonymous Monk means that this:

    sub querryDatabase() { my($inputData) = @_; ...

    should be this:

    sub querryDatabase() { my($self, $inputData) = @_; ...

    because the first argument passed in to any method call is always an object reference. Here’s a contrived (and naïve) example:

    use strict; use warnings; package Widget { use Moose; has 'ID' => ( is => 'rw', isa => 'Str', required => 1, ); sub inc_id { my ($self, $inc) = @_; my $id = $self->ID; my ($prefix, $suffix) = $id =~ /^([^\d]+)(\d+)$/; $self->ID( $prefix . ($suffix + $inc) ); } } my $gizmo = Widget->new( { ID => 'PM142' } ); print $gizmo->ID, "\n"; $gizmo->inc_id(5); print $gizmo->ID, "\n";

    Output:

    16:41 >perl 1366_SoPW.pl PM142 PM147 16:41 >

    Note that the inc_id method receives two arguments, although only the second (in this case, 5) is passed explicitly in the method call $gizmo->inc_id(5). The first argument, a reference to the $gizmo object, is passed implicitly.

    Hope that helps,

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

      should be this:
      sub querryDatabase() { my($self, $inputData) = @_; ...

      And to make that really good, get rid of the useless and misleading empty prototype:

      sub querryDatabase { my($self, $inputData) = @_; ...

      To explain that: Method calls bypass prototype checks, so the prototype is useless. And the method expects one parameter (in addition to the implicit object parameter), so using the empty prototype suggesting that the method takes no parameters is misleading and may confuse you (or someone else) later.

      General rule of thumb for prototypes in Perl: Don't use them unless you really know what you are doing.

      See also: Far More than Everything You've Ever Wanted to Know about Prototypes in Perl -- by Tom Christiansen

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)