in reply to Re^4: Problem conditionally making variables shared if using threads (parens)
in thread Problem conditionally making variables shared if using threads

Ah, after a bit of time, I realized the interplay here is more subtle than I was originally thinking.

My general rule is that, when loading a module conditionally, you have to work to avoid relying upon compile-time magic. The most obvious case of this would be to avoid code like:

if( $threads ) { require threads::shared; threads::shared->import(); share @foo; # No parens used }

Because the "share @foo;" line would cause a compile-time error (if you did 'use strict;') even when that line would never be run.

An even more glaring case is the compile-time magic of the \& sub prototype that allows:

use Exception::Spiffy 'catch'; catch { ... };

For conditional usage, you'd need to do it more like:

require Exception::Spiffy; Exception::Spiffy->import('catch'); &catch( sub { ... } );

But there is a more subtle interaction with the \[$@%] prototype of threads::shared::share(). For example, this code will likely work:

if( $threads ) { require threads::shared; threads::shared->import(); share( \@foo ); }

But it also might not! If some module you loaded for whatever reason loaded something that loaded something that happened to load threads::shared, then that code would fail to compile, complaining:

Type of arg 1 to threads::shared::share must be one of [$@%] (not refe +rence constructor)

So, to be sure your code will work, you need to write it as:

if( $threads ) { require threads::shared; threads::shared->import(); &share( \@foo ); # The ampersand is important }

- tye