{"id":312,"date":"2026-10-13T12:52:02","date_gmt":"2026-10-13T12:52:02","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2012\/04\/05\/difference-between-use-and-require-in-perl\/"},"modified":"2026-10-13T12:52:02","modified_gmt":"2026-10-13T12:52:02","slug":"difference-between-use-and-require-in-perl","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/difference-between-use-and-require-in-perl\/","title":{"rendered":"Perl use vs require: Compile-Time and Runtime Module Loading Explained"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2012-04-05; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you maintain Perl in automation, CI\/CD glue scripts, or legacy operations tooling, choosing between <code>use<\/code> and <code>require<\/code> affects correctness and startup behavior. This article explains what each keyword does, when code is loaded, and how to avoid subtle module-loading mistakes.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2012\/04\/perl-use-require-difference.png\" alt=\"Difference between use and require in Perl\" width=\"600\" height=\"400\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">What <code>use<\/code> and <code>require<\/code> do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>use<\/code> is primarily a compile-time convenience. In practical terms, <code>use Module LIST;<\/code> behaves like a compile-time block that loads the module and then calls <code>import<\/code> for you. <code>require<\/code> loads code at runtime when execution reaches that line, and it does <strong>not<\/strong> import symbols automatically.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-perl\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Some<\/span>::<span class=\"hljs-title\">Module<\/span> <span class=\"hljs-title\">qw<\/span>(<span class=\"hljs-title\">func1<\/span> <span class=\"hljs-title\">func2<\/span>);\n\nBEGIN {\n    <span class=\"hljs-keyword\">require<\/span> Some::Module;\n    Some::Module-&gt;import(qw(func1 func2));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If you want compile-time loading <em>without<\/em> importing, use <code>use Module ();<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>use<\/code> vs <code>require<\/code> comparison<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspect<\/th><th><code>use<\/code><\/th><th><code>require<\/code><\/th><\/tr><\/thead><tbody><tr><td>Execution time<\/td><td>Compile time (via implicit <code>BEGIN<\/code>)<\/td><td>Runtime (when statement is reached)<\/td><\/tr><tr><td>Expected form<\/td><td>Module name (bareword), optional import list<\/td><td>Module\/file form, including expressions<\/td><\/tr><tr><td>Imports symbols<\/td><td>Yes, by default<\/td><td>No (must call <code>import<\/code> explicitly if needed)<\/td><\/tr><tr><td>Conditional loading<\/td><td>Not the usual pattern<\/td><td>Common and straightforward<\/td><\/tr><tr><td>Repeat load behavior<\/td><td>Uses <code>%INC<\/code> tracking under the hood<\/td><td>Checks <code>%INC<\/code> to avoid reloading already loaded files<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Execution flow: compile time vs runtime<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Perl starts compilation] --> B[use Module found]\n    B --> C[Load module now]\n    C --> D[Call import now]\n    D --> E[Program enters runtime]\n    E --> F[require Module reached]\n    F --> G{Already loaded}\n    G -- yes --> H[Skip reload and continue]\n    G -- no --> I[Load module at runtime]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Practical Perl examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Compile-time dependency with exports<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-perl\"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">strict<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">warnings<\/span>;\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">List<\/span>::<span class=\"hljs-title\">Util<\/span> <span class=\"hljs-title\">qw<\/span>(<span class=\"hljs-title\">sum<\/span>);\n\nmy $total = sum(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>);\n<span class=\"hljs-keyword\">print<\/span> <span class=\"hljs-string\">\"$total\\n\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Runtime conditional loading<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-perl\"><span class=\"hljs-keyword\">if<\/span> ($ENV{ENABLE_HIRES}) {\n    <span class=\"hljs-keyword\">require<\/span> Time::HiRes;\n    my $started = Time::HiRes::time();\n    <span class=\"hljs-keyword\">print<\/span> <span class=\"hljs-string\">\"Started at $started\\n\"<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Dynamic module name from configuration<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-perl\">my $module = $ENV{PLUGIN_MODULE} || <span class=\"hljs-string\">'My::Default::Plugin'<\/span>;\n(my $file = <span class=\"hljs-string\">\"$module.pm\"<\/span>) =~ s{::}{\/}g;\n\n<span class=\"hljs-keyword\">require<\/span> $file;\n<span class=\"hljs-keyword\">print<\/span> <span class=\"hljs-string\">\"Loaded $module from $file\\n\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For dynamic loading, remember that converting <code>::<\/code> to <code>\/<\/code> and appending <code>.pm<\/code> is a common pattern when the module name is stored in a variable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Commands to verify behavior in your Perl installation<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">perldoc -f use\nperldoc -f <span class=\"hljs-built_in\">require<\/span>\nperldoc -f <span class=\"hljs-keyword\">do<\/span>\nperldoc perlmod<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Assuming <code>require<\/code> imports symbols automatically (it does not).<\/li><li>Using <code>require<\/code> for a variable module name without converting it to a file path form.<\/li><li>Forgetting that load timing differs: <code>use<\/code> at compile time, <code>require<\/code> at runtime.<\/li><li>Confusing <code>do<\/code> with module loading semantics; it serves a different purpose and should be used intentionally.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <code>use<\/code> for normal, always-required dependencies.<\/li><li>Use <code>use Module ();<\/code> when you want compile-time loading without imports.<\/li><li>Use <code>require<\/code> for optional, delayed, or environment-specific dependencies.<\/li><li>Document module-loading choices in shared scripts so future maintainers understand the timing and import behavior.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In Perl, `use` and `require` both load code, but they do it at different times and with different side effects. This guide shows when each is appropriate, how imports work, and patterns that avoid common production bugs.<\/p>\n","protected":false},"author":1,"featured_media":3846,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[14],"tags":[175,2577,2578,2576,2573,1980,2575,2574,670],"class_list":["post-312","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perl","tag-perl","tag-perl-guide","tag-perl-tutorial","tag-perl-use-and-require-difference","tag-require","tag-use","tag-use-and-require-difference-in-perl","tag-use-vs-require-in-perl","tag-what"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=312"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/312\/revisions"}],"predecessor-version":[{"id":79176,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/312\/revisions\/79176"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3846"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}