CINXE.COM
autouse - postpone load of modules until a function is used - Perldoc Browser
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>autouse - postpone load of modules until a function is used - Perldoc Browser</title> <link rel="search" href="/opensearch.xml" type="application/opensearchdescription+xml" title="Perldoc Browser"> <link rel="canonical" href="https://perldoc.perl.org/autouse"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/styles/stackoverflow-light.min.css" integrity="sha512-cG1IdFxqipi3gqLmksLtuk13C+hBa57a6zpWxMeoY3Q9O6ooFxq50DayCdm0QrDgZjMUn23z/0PMZlgft7Yp5Q==" crossorigin="anonymous" /> <style> body { background: #f4f4f5; color: #020202; } .navbar-dark { background-image: -webkit-linear-gradient(top, #005f85 0, #002e49 100%); background-image: -o-linear-gradient(top, #005f85 0, #002e49 100%); background-image: linear-gradient(to bottom, #005f85 0, #002e49 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff005f85', endColorstr='#ff002e49', GradientType=0); background-repeat: repeat-x; } .navbar-dark .navbar-nav .nav-link, .navbar-dark .navbar-nav .nav-link:focus { color: #fff } .navbar-dark .navbar-nav .nav-link:hover { color: #ffef68 } #wrapperlicious { margin: 0 auto; font: 0.9em 'Helvetica Neue', Helvetica, sans-serif; font-weight: normal; line-height: 1.5em; margin: 0; padding: 0; } #wrapperlicious h1 { font-size: 1.5em } #wrapperlicious h2 { font-size: 1.3em } #wrapperlicious h3 { font-size: 1.1em } #wrapperlicious h4 { font-size: 0.9em } #wrapperlicious h1, #wrapperlicious h2, #wrapperlicious h3, #wrapperlicious h4, #wrapperlicious dt { color: #020202; margin-top: 1em; margin-bottom: 1em; position: relative; font-weight: bold; } #wrapperlicious a { color: inherit; text-decoration: underline } #wrapperlicious #toc { text-decoration: none } #wrapperlicious a:hover { color: #2a2a2a } #wrapperlicious a img { border: 0 } #wrapperlicious :not(pre) > code { color: inherit; background-color: rgba(0, 0, 0, 0.04); border-radius: 3px; font: 0.9em Consolas, Menlo, Monaco, monospace; padding: 0.3em; } #wrapperlicious dd { margin: 0; margin-left: 2em; } #wrapperlicious dt { color: #2a2a2a; font-weight: bold; margin-left: 0.9em; } #wrapperlicious p { margin-bottom: 1em; margin-top: 1em; } #wrapperlicious li > p { margin-bottom: 0; margin-top: 0; } #wrapperlicious pre { border: 1px solid #c1c1c1; border-radius: 3px; font: 100% Consolas, Menlo, Monaco, monospace; margin-bottom: 1em; margin-top: 1em; } #wrapperlicious pre > code { display: block; background-color: #f6f6f6; font: 0.9em Consolas, Menlo, Monaco, monospace; line-height: 1.5em; text-align: left; white-space: pre; padding: 1em; } #wrapperlicious dl, #wrapperlicious ol, #wrapperlicious ul { margin-bottom: 1em; margin-top: 1em; } #wrapperlicious ul { list-style-type: square; } #wrapperlicious ul ul { margin-bottom: 0px; margin-top: 0px; } #footer { font-size: 0.8em; padding-top: 0.5em; text-align: center; } #more { display: inline; font-size: 0.8em; } #perldocdiv { background-color: #fff; border: 1px solid #c1c1c1; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; margin-left: auto; margin-right: auto; padding: 3em; padding-top: 1em; max-width: 960px; } #moduleversion { float: right } #wrapperlicious .leading-notice { font-style: italic; padding-left: 1em; margin-top: 1em; margin-bottom: 1em; } #wrapperlicious .permalink { display: none; left: -0.75em; position: absolute; padding-right: 0.25em; text-decoration: none; } #wrapperlicious h1:hover .permalink, #wrapperlicious h2:hover .permalink, #wrapperlicious h3:hover .permalink, #wrapperlicious h4:hover .permalink, #wrapperlicious dt:hover .permalink { display: block; } </style> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-KVNWBNT5FB"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-KVNWBNT5FB'); gtag('config', 'UA-50555-3'); </script> </head> <body> <nav class="navbar navbar-expand-md navbar-dark bg-dark justify-content-between"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <a class="navbar-brand" href="/"><img src="/images/perl_camel_30.png" width="30" height="30" class="d-inline-block align-top" alt="Perl Camel Logo"> Perldoc Browser</a> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav mr-auto"> <li class="nav-item dropdown text-nowrap"> <a class="nav-link dropdown-toggle" href="#" id="dropdownlink-stable" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">5.22.4</a> <div class="dropdown-menu" aria-labelledby="dropdownlink-stable"> <a class="dropdown-item" href="/autouse">Latest</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.40.1/autouse">5.40.1</a> <a class="dropdown-item" href="/5.40.0/autouse">5.40.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.38.3/autouse">5.38.3</a> <a class="dropdown-item" href="/5.38.2/autouse">5.38.2</a> <a class="dropdown-item" href="/5.38.1/autouse">5.38.1</a> <a class="dropdown-item" href="/5.38.0/autouse">5.38.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.36.3/autouse">5.36.3</a> <a class="dropdown-item" href="/5.36.2/autouse">5.36.2</a> <a class="dropdown-item" href="/5.36.1/autouse">5.36.1</a> <a class="dropdown-item" href="/5.36.0/autouse">5.36.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.34.3/autouse">5.34.3</a> <a class="dropdown-item" href="/5.34.2/autouse">5.34.2</a> <a class="dropdown-item" href="/5.34.1/autouse">5.34.1</a> <a class="dropdown-item" href="/5.34.0/autouse">5.34.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.32.1/autouse">5.32.1</a> <a class="dropdown-item" href="/5.32.0/autouse">5.32.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.30.3/autouse">5.30.3</a> <a class="dropdown-item" href="/5.30.2/autouse">5.30.2</a> <a class="dropdown-item" href="/5.30.1/autouse">5.30.1</a> <a class="dropdown-item" href="/5.30.0/autouse">5.30.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.28.3/autouse">5.28.3</a> <a class="dropdown-item" href="/5.28.2/autouse">5.28.2</a> <a class="dropdown-item" href="/5.28.1/autouse">5.28.1</a> <a class="dropdown-item" href="/5.28.0/autouse">5.28.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.26.3/autouse">5.26.3</a> <a class="dropdown-item" href="/5.26.2/autouse">5.26.2</a> <a class="dropdown-item" href="/5.26.1/autouse">5.26.1</a> <a class="dropdown-item" href="/5.26.0/autouse">5.26.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.24.4/autouse">5.24.4</a> <a class="dropdown-item" href="/5.24.3/autouse">5.24.3</a> <a class="dropdown-item" href="/5.24.2/autouse">5.24.2</a> <a class="dropdown-item" href="/5.24.1/autouse">5.24.1</a> <a class="dropdown-item" href="/5.24.0/autouse">5.24.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item active" href="/5.22.4/autouse">5.22.4</a> <a class="dropdown-item" href="/5.22.3/autouse">5.22.3</a> <a class="dropdown-item" href="/5.22.2/autouse">5.22.2</a> <a class="dropdown-item" href="/5.22.1/autouse">5.22.1</a> <a class="dropdown-item" href="/5.22.0/autouse">5.22.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.20.3/autouse">5.20.3</a> <a class="dropdown-item" href="/5.20.2/autouse">5.20.2</a> <a class="dropdown-item" href="/5.20.1/autouse">5.20.1</a> <a class="dropdown-item" href="/5.20.0/autouse">5.20.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.18.4/autouse">5.18.4</a> <a class="dropdown-item" href="/5.18.3/autouse">5.18.3</a> <a class="dropdown-item" href="/5.18.2/autouse">5.18.2</a> <a class="dropdown-item" href="/5.18.1/autouse">5.18.1</a> <a class="dropdown-item" href="/5.18.0/autouse">5.18.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.16.3/autouse">5.16.3</a> <a class="dropdown-item" href="/5.16.2/autouse">5.16.2</a> <a class="dropdown-item" href="/5.16.1/autouse">5.16.1</a> <a class="dropdown-item" href="/5.16.0/autouse">5.16.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.14.4/autouse">5.14.4</a> <a class="dropdown-item" href="/5.14.3/autouse">5.14.3</a> <a class="dropdown-item" href="/5.14.2/autouse">5.14.2</a> <a class="dropdown-item" href="/5.14.1/autouse">5.14.1</a> <a class="dropdown-item" href="/5.14.0/autouse">5.14.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.12.5/autouse">5.12.5</a> <a class="dropdown-item" href="/5.12.4/autouse">5.12.4</a> <a class="dropdown-item" href="/5.12.3/autouse">5.12.3</a> <a class="dropdown-item" href="/5.12.2/autouse">5.12.2</a> <a class="dropdown-item" href="/5.12.1/autouse">5.12.1</a> <a class="dropdown-item" href="/5.12.0/autouse">5.12.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.10.1/autouse">5.10.1</a> <a class="dropdown-item" href="/5.10.0/autouse">5.10.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.8.9/autouse">5.8.9</a> <a class="dropdown-item" href="/5.8.8/autouse">5.8.8</a> <a class="dropdown-item" href="/5.8.7/autouse">5.8.7</a> <a class="dropdown-item" href="/5.8.6/autouse">5.8.6</a> <a class="dropdown-item" href="/5.8.5/autouse">5.8.5</a> <a class="dropdown-item" href="/5.8.4/autouse">5.8.4</a> <a class="dropdown-item" href="/5.8.3/autouse">5.8.3</a> <a class="dropdown-item" href="/5.8.2/autouse">5.8.2</a> <a class="dropdown-item" href="/5.8.1/autouse">5.8.1</a> <a class="dropdown-item" href="/5.8.0/autouse">5.8.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.6.2/autouse">5.6.2</a> <a class="dropdown-item" href="/5.6.1/autouse">5.6.1</a> <a class="dropdown-item" href="/5.6.0/autouse">5.6.0</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.005_04/autouse">5.005_04</a> <a class="dropdown-item" href="/5.005_03/autouse">5.005_03</a> <a class="dropdown-item" href="/5.005_02/autouse">5.005_02</a> <a class="dropdown-item" href="/5.005_01/autouse">5.005_01</a> <a class="dropdown-item" href="/5.005/autouse">5.005</a> </div> </li> <li class="nav-item dropdown text-nowrap"> <a class="nav-link dropdown-toggle" href="#" id="dropdownlink-dev" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Dev</a> <div class="dropdown-menu" aria-labelledby="dropdownlink-dev"> <a class="dropdown-item" href="/blead/autouse">blead</a> <a class="dropdown-item" href="/5.41.9/autouse">5.41.9</a> <a class="dropdown-item" href="/5.41.8/autouse">5.41.8</a> <a class="dropdown-item" href="/5.41.7/autouse">5.41.7</a> <a class="dropdown-item" href="/5.41.6/autouse">5.41.6</a> <a class="dropdown-item" href="/5.41.5/autouse">5.41.5</a> <a class="dropdown-item" href="/5.41.4/autouse">5.41.4</a> <a class="dropdown-item" href="/5.41.3/autouse">5.41.3</a> <a class="dropdown-item" href="/5.41.2/autouse">5.41.2</a> <a class="dropdown-item" href="/5.41.1/autouse">5.41.1</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.40.1-RC1/autouse">5.40.1-RC1</a> <a class="dropdown-item" href="/5.40.0-RC2/autouse">5.40.0-RC2</a> <a class="dropdown-item" href="/5.40.0-RC1/autouse">5.40.0-RC1</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.39.10/autouse">5.39.10</a> <a class="dropdown-item" href="/5.39.9/autouse">5.39.9</a> <a class="dropdown-item" href="/5.39.8/autouse">5.39.8</a> <a class="dropdown-item" href="/5.39.7/autouse">5.39.7</a> <a class="dropdown-item" href="/5.39.6/autouse">5.39.6</a> <a class="dropdown-item" href="/5.39.5/autouse">5.39.5</a> <a class="dropdown-item" href="/5.39.4/autouse">5.39.4</a> <a class="dropdown-item" href="/5.39.3/autouse">5.39.3</a> <a class="dropdown-item" href="/5.39.2/autouse">5.39.2</a> <a class="dropdown-item" href="/5.39.1/autouse">5.39.1</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.38.3-RC1/autouse">5.38.3-RC1</a> </div> </li> <li class="nav-item dropdown text-nowrap"> <a class="nav-link dropdown-toggle" href="#" id="dropdownlink-nav" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Documentation</a> <div class="dropdown-menu" aria-labelledby="dropdownlink-nav"> <a class="dropdown-item" href="/5.22.4/perl">Perl</a> <a class="dropdown-item" href="/5.22.4/perlintro">Intro</a> <a class="dropdown-item" href="/5.22.4/perl#Tutorials">Tutorials</a> <a class="dropdown-item" href="/5.22.4/perlfaq">FAQs</a> <a class="dropdown-item" href="/5.22.4/perl#Reference-Manual">Reference</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.22.4/perlop">Operators</a> <a class="dropdown-item" href="/5.22.4/functions">Functions</a> <a class="dropdown-item" href="/5.22.4/variables">Variables</a> <a class="dropdown-item" href="/5.22.4/modules">Modules</a> <a class="dropdown-item" href="/5.22.4/perlutil">Utilities</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="/5.22.4/perldelta">Release Notes</a> <a class="dropdown-item" href="/5.22.4/perlcommunity">Community</a> <a class="dropdown-item" href="/5.22.4/perlhist">History</a> </div> </li> </ul> <ul class="navbar-nav"> <script> function set_expand (expand) { var perldocdiv = document.getElementById('perldocdiv'); var width = window.getComputedStyle(perldocdiv).getPropertyValue('max-width'); var expanded = (width == '' || width == 'none') ? true : false; if (expand === null) { expand = !expanded; } if ((expand && !expanded) || (!expand && expanded)) { perldocdiv.style.setProperty('max-width', expand ? 'none' : '960px'); var button_classlist = document.getElementById('content-expand-button').classList; if (expand) { button_classlist.add('btn-light'); button_classlist.remove('btn-outline-light'); } else { button_classlist.add('btn-outline-light'); button_classlist.remove('btn-light'); } } return expand; } function toggle_expand () { var expand = set_expand(null); document.cookie = 'perldoc_expand=' + (expand ? 1 : 0) + '; path=/; expires=Tue, 19 Jan 2038 03:14:07 UTC'; } function read_expand () { return document.cookie.split(';').some(function (item) { return item.indexOf('perldoc_expand=1') >= 0 }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', function () { if (read_expand()) { set_expand(true); } }); } else if (read_expand()) { set_expand(true); } </script> <button id="content-expand-button" type="button" class="btn btn-outline-light d-none d-lg-inline-block mr-4" onclick="toggle_expand()">Expand</button> </ul> <form class="form-inline" method="get" action="/5.22.4/search"> <input class="form-control mr-3" type="search" name="q" placeholder="Search" aria-label="Search" value=""> </form> </div> </nav> <div id="wrapperlicious" class="container-fluid"> <div id="perldocdiv"> <div id="links"> <a href="/5.22.4/autouse">autouse</a> <div id="more"> (<a href="/5.22.4/autouse.txt">source</a>, <a href="https://metacpan.org/pod/autouse">CPAN</a>) </div> <div id="moduleversion">version 1.08</div> </div> <div class="leading-notice"> You are viewing the version of this documentation from Perl 5.22.4. <a href="/autouse">View the latest version</a> </div> <h1><a id="toc">CONTENTS</a></h1> <ul> <li> <a class="text-decoration-none" href="#NAME">NAME</a> </li> <li> <a class="text-decoration-none" href="#SYNOPSIS">SYNOPSIS</a> </li> <li> <a class="text-decoration-none" href="#DESCRIPTION">DESCRIPTION</a> </li> <li> <a class="text-decoration-none" href="#WARNING">WARNING</a> </li> <li> <a class="text-decoration-none" href="#AUTHOR">AUTHOR</a> </li> <li> <a class="text-decoration-none" href="#SEE-ALSO">SEE ALSO</a> </li> </ul> <h1 id="NAME"><a class="permalink" href="#NAME">#</a>NAME</h1> <p>autouse - postpone load of modules until a function is used</p> <h1 id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">#</a>SYNOPSIS</h1> <pre><code>use autouse 'Carp' => qw(carp croak); carp "this carp was predeclared and autoused ";</code></pre> <h1 id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">#</a>DESCRIPTION</h1> <p>If the module <code>Module</code> is already loaded, then the declaration</p> <pre><code>use autouse 'Module' => qw(func1 func2($;$));</code></pre> <p>is equivalent to</p> <pre><code>use Module qw(func1 func2);</code></pre> <p>if <code>Module</code> defines func2() with prototype <code>($;$)</code>, and func1() has no prototypes. (At least if <code>Module</code> uses <code>Exporter</code>'s <code>import</code>, otherwise it is a fatal error.)</p> <p>If the module <code>Module</code> is not loaded yet, then the above declaration declares functions func1() and func2() in the current package. When these functions are called, they load the package <code>Module</code> if needed, and substitute themselves with the correct definitions.</p> <h1 id="WARNING"><a class="permalink" href="#WARNING">#</a>WARNING</h1> <p>Using <code>autouse</code> will move important steps of your program's execution from compile time to runtime. This can</p> <ul> <li><p>Break the execution of your program if the module you <code>autouse</code>d has some initialization which it expects to be done early.</p> </li> <li><p>hide bugs in your code since important checks (like correctness of prototypes) is moved from compile time to runtime. In particular, if the prototype you specified on <code>autouse</code> line is wrong, you will not find it out until the corresponding function is executed. This will be very unfortunate for functions which are not always called (note that for such functions <code>autouse</code>ing gives biggest win, for a workaround see below).</p> </li> </ul> <p>To alleviate the second problem (partially) it is advised to write your scripts like this:</p> <pre><code>use Module; use autouse Module => qw(carp($) croak(&$)); carp "this carp was predeclared and autoused ";</code></pre> <p>The first line ensures that the errors in your argument specification are found early. When you ship your application you should comment out the first line, since it makes the second one useless.</p> <h1 id="AUTHOR"><a class="permalink" href="#AUTHOR">#</a>AUTHOR</h1> <p>Ilya Zakharevich (ilya@math.ohio-state.edu)</p> <h1 id="SEE-ALSO"><a class="permalink" href="#SEE-ALSO">#</a><a id="SEE"></a>SEE ALSO</h1> <p>perl(1).</p> </div> <div id="footer"> <p>Perldoc Browser is maintained by Dan Book (<a href="https://metacpan.org/author/DBOOK">DBOOK</a>). Please contact him via the <a href="https://github.com/Grinnz/perldoc-browser/issues">GitHub issue tracker</a> or <a href="mailto:dbook@cpan.org">email</a> regarding any issues with the site itself, search, or rendering of documentation.</p> <p>The Perl documentation is maintained by the Perl 5 Porters in the development of Perl. Please contact them via the <a href="https://github.com/Perl/perl5/issues">Perl issue tracker</a>, the <a href="https://lists.perl.org/list/perl5-porters.html">mailing list</a>, or <a href="https://kiwiirc.com/client/irc.perl.org/p5p">IRC</a> to report any issues with the contents or format of the documentation.</p> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.slim.min.js" integrity="sha512-/DXTXr6nQodMUiq+IUJYCt2PPOUjrHJ9wFrqpJ3XkgPNOZVfMok7cRw6CSxyCQxXn6ozlESsSh1/sMCTF1rL/g==" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js" integrity="sha512-ubuT8Z88WxezgSqf3RLuNi5lmjstiJcyezx34yIU2gAHonIi27Na7atqzUZCOoY4CExaoFumzOsFQ2Ch+I/HCw==" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script> <script src="/js/highlight.pack.js"></script> <script>hljs.highlightAll();</script> </body> </html>