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

Well that's the question is there a possible way of making a subroutine private for particular package

Replies are listed 'Best First'.
Re: private subroutine in package?
by Dominus (Parson) on Mar 12, 2000 at 03:20 UTC

    Yes, but you have to call it a little differently.

    	package Whatever;
    	my $privatesub = 
    	  sub { 
    	    # blah blah blah 
    	  };
    
    	sub publicsub {
    	  $privatesub->(arguments...);
    	}
    

    Here we've made an anonymous subroutine and stored it in a private my variable. No code outside this file will be able to see the $privatesub variable, so the private subroutine is only accessible from inside the file.

    Since $privatesub is actually a reference to our private subroutine, we need to use the -> notation to invoke it.

Re: private subroutine in package?
by Juerd (Abbot) on Dec 25, 2001 at 02:39 UTC
    Perl doesn't have real private package subroutines. However, it's possible to create a reference to an anonymous sub. Such a reference can be put in a scalar, and a scalar can be lexically scoped using `my'.
    Most people don't use this, for several reasons. Some people don't like to have to use a sigil and a derefence operator every time they call the private sub, some people just don't like the idea.
    When you look around in some modules, you'll see a lot of subs beginning with an underscore. Those subs are pretty much always meant to be private. If someone nevertheless decides to call it, that's his/her problem :)

    I've never found a good reason for having really private subroutines. The underscore indicates it's something special, so the coder who uses it, knows he does so on his own risk.

    A quote from perlmod:
    Variables beginning with underscore used to be forced into package main, but we decided it was more useful for package writers to be able to use leading underscore to indicate private variables and method names. $_ is still global though. See also "Technical Note on the Syntax of Variable Names" in perlvar.

    2;0 juerd@ouranos:~$ perl -e'undef christmas' Segmentation fault 2;139 juerd@ouranos:~$

Re: private subroutine in package?
by outcast (Monk) on Mar 13, 2000 at 08:47 UTC
    I like it
      Is there any reason why this wouldn't work recursively?