in reply to Re^2: slow startup for some common modules? (autodie, Pod::Usage, Getopt::Long))
in thread slow startup for some common modules? (autodie, Pod::Usage, Getopt::Long))

use Pod::Usage; # is the same as BEGIN { require Pod::Usage; Pod::Usage->import(); }
BEGIN blocks execute at compile time, not run time.

Assuming that often you run without ever using the Pod functions, and you want to fire that module up only if you will be needing it, you could have a runtime flag like this:

if ($needPod) { require Pod::Usage; Pod::Usage->import(); }
I leave it you to decide how this applies to your code. You have to do the require and import before using any functionality of Pod::Usage.

Usually GetOPt::Std is enough for me. I almost never use autodie and absolutely never use it in end user code.

Replies are listed 'Best First'.
Re^4: slow startup for some common modules? (autodie, Pod::Usage, Getopt::Long))
by almr (Beadle) on Jan 06, 2023 at 23:08 UTC
    Ah. Then why not use Pod::Usage if $needPod;
      > use Pod::Usage if $needPod;

      Timing! You can't make a compile-time use (the BEGIN-part) depend on run-time conditions.

      FWIW: you could use the if pragma, but only if the condition is available at compile-time

        Because use takes effect at compile time, it doesn't respect the ordinary flow control of the code being compiled. In particular, putting a use inside the false branch of a conditional doesn't prevent it from being processed. If a module or pragma only needs to be loaded conditionally, this can be done using the if pragma:

        use if $] < 5.008, "utf8"; use if WANT_WARNINGS, warnings => qw(all);

      but as you see the conditions here are (compile time) constants

      Cheers Rolf
      (addicted to the 𐍀𐌴𐍂𐌻 Programming Language :)
      Wikisyntax for the Monastery