保存Perl Windows环境密钥对其进行升级
我有一个用Perl编写的框架,该框架设置了一堆环境变量以支持进程间(通常是子进程)通信。我们在XML-ish文件中保留一组键/值对。我们试图将关键字命名为驼峰式的" somethingLikeThis"。这一切都很好。
最近,我们曾有机会将控制(链)过程从Windows传递到UNIX。当我们将%ENV哈希值从Windows吐出到文件中时,somethingLikeThis键变成了SomethingLikeTHIS。当Unix进程拾取文件并重新加载环境并查找$ ENV {somethingLikeThis}
的值时,它不存在,因为UNIX区分大小写(在Windows端,相同的代码可以正常工作)。
此后,我们回过头来更改了大写的所有键并解决了问题,但这很繁琐,并且给用户带来了痛苦。有没有办法使Windows上的Perl保留环境哈希键的字符大小写?
解决方案
回答
据我所记得,在Windows和* NIX环境中,建议对环境变量使用ALL_CAPS。我的猜测是Perl仅使用某种旧式API来访问环境,因此仅检索变量的仅大写名称。
无论如何,我们永远都不要依赖这样的东西,甚至更多,因此,如果我们要让用户设置变量,请想象一个简单的错失变量会产生多大的加重和混乱!我们必须记住,一些将保持匿名的操作系统尚未学会如何区分大小写的文件...
回答
我相信我们会发现Windows环境变量实际上是不区分大小写的,因此键是大写的,以避免混淆。
这样,不区分大小写的Windows脚本可以使用与其他所有变量相同的变量。
回答
Hyman·M:同意,在Windows上不是问题。如果创建环境变量Foo,则可以在Perl中将其引用为$ ENV {FOO}或者$ ENV {fOO}或者$ ENV {foo}。问题是:我将其创建为Foo,然后将整个%ENV转储到文件中,然后从* NX读取文件以重新创建环境哈希,并使用相同的脚本引用$ ENV {Foo},该哈希值不存在($ ENV {FOO}确实存在)。
我们采用了davidg建议的所有大写解决方法。我只是想知道在Windows上从Perl写入%ENV哈希的键时是否有任何"保留大小写"的方法。
回答
据我所知,没有。似乎我们最好使用其他哈希而不是%ENV。如果我们要调用许多外部模块并希望在它们之间跟踪相同的变量,则可以使用Factory模式,这样我们就不会破坏DRY,并且能够在多个模块之间使用区分大小写的哈希值。唯一的窍门就是让这些变量在Factory中的所有对象之间保持更新,但是我敢肯定我们可以解决这个问题。
回答
首先,为了解决问题,我相信在set周围使用反引号并自行解析会起作用。在我的Windows系统上,此脚本可以正常工作。
my %env = map {/(.*?)=(.*)/;} `set`; print join(' ', sort keys %env);
在骆驼书中,第25章:Portable Perl中的建议是,"系统交互"部分是"不要依赖于%ENV中存在的特定环境变量,并且不要假设%ENV中的任何内容都区分大小写或者大小写不要保留环境变量的Unix继承语义;在某些系统上,所有其他进程可能都可以看到它们。"