in reply to Re^4: 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.

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]); }

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

    Cute alternative:

    sub unidecode { require Text::Unidecode; no warnings 'redefine'; *unidecode = \&Text::Unidecode::unidecode; goto &unidecode; }
Re^6: Use module only if it is in use
by vitoco (Hermit) on Sep 02, 2009 at 16:33 UTC

    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; ... }