---
name: "Perl::Critic::Policy::Modules::ProhibitPOSIXimport"
section: "3pm"
platform: "linux"
package: "libperl-critic-pulp-perl"
version: "99-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Perl::Critic::Policy::Modules::ProhibitPOSIXimport"
---

# Perl::Critic::Policy::Modules::ProhibitPOSIXimport(3pm)

don't import the whole of POSIX into a module

## NAME

Perl::Critic::Policy::Modules::ProhibitPOSIXimport - don't import the whole of POSIX into a module

## DESCRIPTION

This policy is part of the `"Perl::Critic::Pulp"` add-on.  It asks you not to `"use POSIX"` with an import of all the symbols from that module if you're only using a few things.

```
    package Foo;
    use POSIX;    # bad
```

The aim is to save some memory, and maybe run a bit faster.  A full `"POSIX"` import adds about 550 symbols to your module and that's about 30 to 40 kbytes in Perl 5.10 on a 32-bit system, or about 115 kbytes in Perl 5.8.  If lots of modules do this then it adds up.

As noted in the `"POSIX"` module docs, the way it exports everything by default is an historical accident, not something to encourage.

### Allowed Forms

A full import is allowed in `"package main"`, which is the top-level of a script etc, since in a script you want convenience rather than a bit of memory, at least initially.

```
    #!/usr/bin/perl
    use POSIX;        # ok
```

An import of no symbols is allowed and you then add a `"POSIX::"` qualifier to each call or constant.  Qualifiers like this can make it clear where the function is coming from.

```
    package Foo;
    use POSIX (); # ok
    my $fd = POSIX::dup(0);
    if ($! == POSIX::ENOENT())
```

An import of an explicit set of functions and constants is allowed.  This allows short names without the memory penalty of a full import.  However it can be error-prone to update the imports with what you actually use (see `"ProhibitCallsToUndeclaredSubs"` for some checking).

```
    package Foo;
    use POSIX qw(dup ENOENT); # ok
    ...
    my $fd = dup(0);
```

A full import is allowed in a module if there's 15 or more calls to `"POSIX"` module functions.  This rule might change or be configurable in the future, but the intention is that a module making heavy use of `"POSIX"` shouldn't be burdened by a `"POSIX::"` on every call or by maintaining a list of explicit imports.

```
    package Foo;
    use POSIX;         # ok
    ...
    tzset(); dup(1)... # 15 or more calls to POSIX stuff
```

### Disabling

If you don't care this sort of thing you can always disable `"ProhibitPOSIXimport"` from your *.perlcriticrc* in the usual way (see "CONFIGURATION" in Perl::Critic),

```
    [-Modules::ProhibitPOSIXimport]
```

## SEE ALSO

POSIX, Perl::Critic::Pulp, Perl::Critic, Perl::Critic::Policy::Subroutines::ProhibitCallsToUndeclaredSubs

## HOME PAGE

\<http://user42.tuxfamily.org/perl-critic-pulp/index.html\>

## COPYRIGHT

Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, 2021 Kevin Ryde

Perl-Critic-Pulp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version.

Perl-Critic-Pulp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with Perl-Critic-Pulp.  If not, see \<http://www.gnu.org/licenses/\>.
