---
name: "Perl::Critic::Policy::Subroutines::ProtectPrivateSubs"
section: "3pm"
platform: "linux"
package: "perl-perl-critic"
version: "1.156-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Perl::Critic::Policy::Subroutines::ProtectPrivateSubs"
---

# Perl::Critic::Policy::Subroutines::ProtectPrivateSubs(3pm)

Prevent access to private subs in other packages.

## NAME

Perl::Critic::Policy::Subroutines::ProtectPrivateSubs - Prevent access to private subs in other packages.

## AFFILIATION

This Policy is part of the core Perl::Critic distribution.

## DESCRIPTION

By convention Perl authors (like authors in many other languages) indicate private methods and variables by inserting a leading underscore before the identifier.  This policy catches attempts to access private variables from outside the package itself.

The subroutines in the POSIX package which begin with an underscore (e.g. `"POSIX::_POSIX_ARG_MAX"`) are not flagged as errors by this policy.

## CONFIGURATION

You can define what a private subroutine name looks like by specifying a regular expression for the `"private_name_regex"` option in your *.perlcriticrc*:

```
    [Subroutines::ProtectPrivateSubs]
    private_name_regex = _(?!_)\w+
```

The above example is a way of saying that subroutines that start with a double underscore are not considered to be private.  (Perl::Critic, in its implementation, uses leading double underscores to indicate a distribution-private subroutine-- one that is allowed to be invoked by other Perl::Critic modules, but not by anything outside of Perl::Critic.)

You can configure additional subroutines to accept by specifying them in a space-delimited list to the `"allow"` option:

```
    [Subroutines::ProtectPrivateSubs]
    allow = FOO::_bar FOO::_baz
```

These are added to the default list of exemptions from this policy. Allowing a subroutine also allows the corresponding method call. So `"FOO::_bar"` in the above example allows both `FOO::_bar()` and `"FOO->_bar()"`.

## HISTORY

This policy is inspired by a similar test in B::Lint.

## BUGS

Doesn't forbid `"$pkg->_foo()"` because it can't tell the difference between that and `"$self->_foo()"`.

## SEE ALSO

Perl::Critic::Policy::Variables::ProtectPrivateVars

## AUTHOR

Chris Dolan \<cdolan@cpan.org\>

## COPYRIGHT

Copyright (c) 2006-2011 Chris Dolan.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.  The full text of this license can be found in the LICENSE file included with this module.
