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

Yes, but again, why? I can't think of a scenario where this would possibly be useful. It feels like you're testing for a side-effect of the problem, and not for the problem itself.

Replies are listed 'Best First'.
Re^4: Use module only if it is in use
by vitoco (Hermit) on Sep 02, 2009 at 15:47 UTC

    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.

      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.