2008-09-02 15 views
3

私は、プロセス間(通常はサブプロセス)の通信をサポートするための環境変数を設定するPerlで書かれたフレームワークを用意しています。 XML-ishファイルに一連のキー/値のペアを保持します。キャメルケースのキー名をsomethingLikeThisにしようとしました。これはすべてうまくいく。PerlのWindows環境キーを保存することをお勧めします。

最近、WindowsからUNIXへの制御(チェーン)プロセスを渡す機会がありました。 Windowsからのファイルに%ENVハッシュを吐き出すと、somethingLikeThisの鍵はSOMETHINGLIKETHISになります。 Unixプロセスがファイルを取得して環境をリロードし、$ENV{somethingLikeThis}の値を参照すると、UNIXは大文字と小文字を区別するため(Windows側からは同じコードがうまく動作します)、存在しません。

我々はそれ以来戻ったと大文字にすべてのキーを変更して問題を解決し、それは退屈だったとユーザーに苦痛を引き起こしています。 Windows上のPerlに環境ハッシュのキーの大文字小文字の区別を保持させる方法はありますか?

答えて

2

は、私が覚えている限りでは、環境変数のALL_CAPSを使用すると、Windowsと* NIXの世界の両方でお勧めです。私の推測では、Perlは環境にアクセスするための従来のAPIを使用しているだけなので、変数の大文字のみの名前を取得します。

いずれにしても、そのようなものに頼るべきではありません。さらに、変数を設定するようユーザーに求めている場合、単純なミスペルト変数がどの程度悪化し、混乱するか想像してください。あなたは無名のままになりますいくつかのOSはまだケースに機密ファイルを実行する方法を学んでいないことを覚えている...

3

私はあなたがWindows環境変数が実際に大文字と小文字を区別しない見つけることを信じて、このようにキーがで大文字されています混乱を避けるために注文してください。 このように、大文字と小文字の区別の概念を持たないWindowsスクリプトでは、他のすべてと同じ変数を使用できます。

0

Jack M:合意、Windowsでは問題ありません。環境変数Fooを作成すると、$ ENV {FOO}または$ ENV {fOO}または$ ENV {foo}としてPerlで参照できます。問題は次のとおりです。Fooとして作成し、%ENV全体をファイルにダンプし、* NXからファイルを読み込んでEnvironmentハッシュを再作成し、$ ENV {Foo}を参照するために同じスクリプトを使用します。 ($ ENV {FOO}は存在します)。

davidgが提案した大文字の回避策をすべて採用しました。私は、Windows上のPerlから%ENVハッシュにキーを書き出すときに、 "大文字小文字を維持する"方法があるかどうか疑問に思っていました。

0

私の知る限りではありません。あなたは%ENVの代わりに別のハッシュを使う方が良いかもしれないようです。多くの外部モジュールを呼び出して、それらの変数を同じ変数で追跡したい場合、FactoryパターンはDRYを中断しないように動作し、複数のモジュール間で大文字小文字を区別するハッシュを使用できます。唯一のやり方は、これらの変数をFactoryのすべてのオブジェクトに更新しておくことですが、それを解決できると確信しています。

2

まず、あなたの問題を解決するために、私はセットの周りにバックティックを使用し、それを自分自身で解析すると信じています。私のWindowsシステムでは、このスクリプトはうまくいきました。ラクダ本で

my %env = map {/(.*?)=(.*)/;} `set`; 
print join(' ', sort keys %env); 

、第25章でのアドバイス:ポータブルPerlは、システムの相互作用部は、%ENVで既存の変数の特定の環境に依存しないでください、そして%でその何かを想定していない」でありますENVは大文字と小文字を区別したり、大文字と小文字を区別したりします。環境変数のUnix継承セマンティクスは想定せず、システムによっては他のすべてのプロセスから見える場合もあります。