長いタイトルですが、質問の真の意味を失わずに一言も聞き出せないのではないかと心配しています。最初に何を達成しようとしているのかを簡単に説明し、次になぜこのようにしたいのかについて長々と説明します。質問のタイトルを順守して直接回答する場合は、とりとめのないものをスキップしてください:-)
簡単な説明
私が望むことだけを行うビルトインが存在すると仮定すると、次のlexicalize
ようになります。
package Whatever;
{
lexicalize $Other::Package::var;
local $var = 42;
Other::Package->do_stuff; # depends on that variable internally
}
理由と理由
ちょっとした文脈のために、私はサードパーティのモジュールをホワイトボックステストしています。
テストが別のものに移る前に、限られた時間だけ変数を変更したいので 、変数をローカライズしたいと思います。local
初期値に対するモジュールの選択を知ることに依存せずにこれを行うことがわかった最良の方法です。
字句バインディングが必要な主な理由は 2 つあります。
- テスト ファイルの上位の名前空間を汚染したくありません。
- 完全修飾名よりも短いものが必要です。簡潔にするためにサンプルコードには含まれていませんが、以前の値に関連する計算と更新を使用して、示されているものよりもはるかに多くの識別子を使用しています。
our
別のパッケージから変数を取得しないため、適切に使用できませんでした。一時的に Other::Package のスコープに入るための不正行為はそれをカットしません: ブロック ( { package Other::Package; our $var }
) を使用すると、バインディングは有用であるほど長く持続しません。そうでない場合はpackage Other::Package; our @var; package main
、前のパッケージの名前を知ってコピーする必要があります。これにより、そのコードの一部を移動しすぎるのを防ぐことができます。
この質問の前の形式を尋ねる前に宿題をしているときに、まさに私が必要とLexical::Var
していたものだと思われるを発見しました。悲しいかな: 「参照を通じてローカライズできません。」</p>
また、- ベースのフォームの直感で最善を尽くしましたmy *var
が、構文エラーにぶつかり続けました。今日はスコープとバインドについて、思ったよりも多くのことを学びました :-)
私が望んでいることが不可能な理由が思い浮かびませんが、適切な呪文が見つかりません。残念ながら実装されていないエッジケースを求めていますか?