Perl の明らかな動作は、汚染された状態に基づいて枝の剪定後に残っている枝の定数を汚染することです。これは文書化されていますか?
これは出力します1
:
bash$ T="" perl -Tle '
use constant T=>$ENV{T};
use Scalar::Util qw/tainted/;
exit if T;
print tainted(0)'
exit の後のすべて (元の問題では return でした) は、汚染された状態に基づいてブランチの剪定が発生した後に残るブランチにあるため、定数0
が汚染されているようです。これはたまたま Perl の汚染モードの非常に気の利いた機能ですが、そのドキュメントはどこにも見つかりません。が設定されていない場合$ENV{T}
、または条件が への動的アクセスにある$ENV{T}
場合、定数は汚染されません。
ちなみに、この質問が発生する関連する暗黙の実際のソフトウェア開発の問題に対する現時点で私が知っている最良の答えは、定数を汚染することなく、開発時に汚染モードの perl ソースのセクションをオフにするにはどうすればよいかということです。次のように、汚染された環境変数ではなく、定数を定数に設定します。
use constant DEBUG_MODE => ( $ENV{DEV_DEBUG} ? 1 : 0 );