3

プロセス間(通常はサブプロセス)通信をサポートするために一連の環境変数を設定する Perl で記述されたフレームワークがあります。キーと値のペアのセットを XML 風のファイルに保持します。キー名を camel-case にしようとしましたsomethingLikeThis。これはすべてうまくいきます。

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

その後、戻ってすべてのキーを大文字に変更し、問題を解決しましたが、それは面倒であり、ユーザーに苦痛を与えました. Windows 上の Perl で環境ハッシュのキーの大文字と小文字を区別する方法はありますか?

4

5 に答える 5

3

Windows 環境変数は実際には大文字と小文字が区別されないことがわかると思います。そのため、混乱を避けるためにキーは大文字になっています。このようにして、大文字と小文字の区別の概念がない Windows スクリプトは、他のすべてのものと同じ変数を使用できます。

于 2008-09-03T21:47:19.367 に答える
2

私が覚えている限りでは、環境変数に ALL_CAPS を使用することは、Windows と *NIX の両方の世界で推奨される方法です。私の推測では、Perl はある種のレガシー API を使用して環境にアクセスしているだけなので、変数の大文字のみの名前を取得するだけです。

いずれにせよ、そのようなものに頼るべきではありません。さらに、ユーザーに変数を設定するように要求する場合は、単純なスペルミスの変数がどれだけの悪化と混乱を引き起こすか想像してみてください! 名前のないままになる一部のOSは、大文字と小文字を区別するファイルの処理方法をまだ学習していないことを覚えておく必要があります...

于 2008-09-03T00:28:58.800 に答える
2

まず、問題を解決するには、セットの周りにバッククォートを使用して自分で解析するとうまくいくと思います。私の Windows システムでは、このスクリプトは問題なく動作しました。

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

ラクダの本では、Chapter 25: Portable Perl の System Interaction セクションのアドバイスは、「%ENV に存在する特定の環境変数に依存しないでください。環境変数の Unix 継承セマンティクスを想定しないでください。一部のシステムでは、他のすべてのプロセスから可視になる場合があります。」

于 2008-09-16T15:52:13.413 に答える
0

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

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

于 2008-09-06T13:39:38.810 に答える
0

私の知る限り、ありません。%ENV の代わりに別のハッシュを使用した方がよいようです。多くの外部モジュールを呼び出していて、それら全体で同じ変数を追跡したい場合は、Factory パターンが機能するため、DRY を壊さず、複数のモジュールで大文字と小文字を区別するハッシュを使用できます。唯一の秘訣は、これらの変数を Factory からのすべてのオブジェクトにわたって更新し続けることですが、それを解決できると確信しています。

于 2008-09-09T15:31:46.610 に答える