---
name: "Perl::Critic::Policy::Variables::ProhibitPackageVars"
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::Variables::ProhibitPackageVars"
---

# Perl::Critic::Policy::Variables::ProhibitPackageVars(3pm)

Eliminate globals declared with "our" or "use vars".

## NAME

Perl::Critic::Policy::Variables::ProhibitPackageVars - Eliminate globals declared with "our" or "use vars".

## AFFILIATION

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

## DESCRIPTION

Conway suggests avoiding package variables completely, because they expose your internals to other packages.  Never use a package variable when a lexical variable will suffice.  If your package needs to keep some dynamic state, consider using an object or closures to keep the state private.

This policy assumes that you're using `"strict vars"` so that naked variable declarations are not package variables by default.  Thus, it complains you declare a variable with `"our"` or `"use vars"`, or if you make reference to variable with a fully-qualified package name.

```
    $Some::Package::foo = 1;    # not ok
    our $foo            = 1;    # not ok
    use vars '$foo';            # not ok
    $foo = 1;                   # not allowed by 'strict'
    local $foo = 1;             # bad taste, but technically ok.
    use vars '$FOO';            # ok, because it's ALL CAPS
    my $foo = 1;                # ok
```

In practice though, its not really practical to prohibit all package variables.  Common variables like `$VERSION` and `@EXPORT` need to be global, as do any variables that you want to Export.  To work around this, the Policy overlooks any variables that are in ALL\_CAPS. This forces you to put all your exported variables in ALL\_CAPS too, which seems to be the usual practice anyway.

## CONFIGURATION

There is room for exceptions.  Some modules, like the core File::Find module, use package variables as their only interface, and others like Data::Dumper use package variables as their most common interface. These module can be specified from your *.perlcriticrc* file, and the policy will ignore them.

```
    [Variables::ProhibitPackageVars]
    packages = Data::Dumper File::Find FindBin Log::Log4perl
```

This is the default setting.  Using `"packages ="`  will override these defaults.

You can also add packages to the defaults like so:

```
    [Variables::ProhibitPackageVars]
    add_packages = My::Package
```

You can add package `"main"` to the list of packages, but that will only OK variables explicitly in the `"main"` package.

## SEE ALSO

Perl::Critic::Policy::Variables::ProhibitPunctuationVars

Perl::Critic::Policy::Variables::ProhibitLocalVars

## AUTHOR

Jeffrey Ryan Thalhammer \<jeff@imaginative-software.com\>

## COPYRIGHT

Copyright (c) 2005-2023 Imaginative Software Systems.  All rights reserved.

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.
