http://www.perlmonks.org?node_id=792952


in reply to Re^3: Use module only if it is in use
in thread Use a module only if it is in use

I don't want to load helper modules that potentially won't be used.

For example, I have to use unidecode() from Text::Unidecode in the module only if the calling program also uses it. Using that method always have a penalty in performance if data is ASCII only.

You are right if you think that a parameter or something like that should be used, but I want to keep things simple and don't want to force an installation of a non-core module that won't be used.

BTW, I tried some other things like loading the external module from my own only if a parameter is being set in new() (yes, runtime!), but the code become dirty.

Replies are listed 'Best First'.
Re^5: Use module only if it is in use
by ikegami (Patriarch) on Sep 02, 2009 at 16:13 UTC

    I don't want to load helper modules that potentially won't be used.

    How does not calling the sub you need to call solve that?

    The actual solution is to delay loading the module until you need it.

    sub rarely_called { require Text::Unidecode; return Text::Unidecode::unidecode($_[0]); }

    You can throw in an import in there if you so desire.

    sub rarely_called { require Text::Unidecode; import Text::Unidecode qw( unidecode ); return unidecode($_[0]); }

      Cute alternative:

      sub unidecode { require Text::Unidecode; no warnings 'redefine'; *unidecode = \&Text::Unidecode::unidecode; goto &unidecode; }

      Shouldn't that have a relevant overhead when used as:

      while ($line = <F>) { chomp($line); $line = rarely_called($line) if $asciify; ... }

      BTW, I did something like that (using eval), but checking a flag to require the module only in the first call.

        Benchmark and find out. Or use the self-loading alternative. Or split the initialisation from the actual use.
        require Text::Unidecode if $asciify; while ($line = <F>) { chomp($line); $line = Text::Unidecode::unidecode($line) if $asciify; ... }