3

我有一个用 Perl 编写的框架,它设置了一堆环境变量来支持进程间(通常是子进程)通信。我们在 XML-ish 文件中保存一组键/值对。我们尝试将键名命名为 camel-case somethingLikeThis。这一切都很好。

最近我们有机会将控制(链)进程从 Windows 传递到 UNIX。当我们从 Windows 将哈希值吐出%ENV到文件时,somethingLikeThis密钥变为SOMETHINGLIKETHIS. 当 Unix 进程获取文件并重新加载环境并查找它的值时,$ENV{somethingLikeThis}它的值不存在,因为 UNIX 区分大小写(从 Windows 端来看,相同的代码可以正常工作)。

此后我们返回并将所有键更改为大写并解决了问题,但这很乏味并给用户带来了痛苦。有没有办法让 Windows 上的 Perl 保留环境哈希键的字符大小写?

4

5 回答 5

3

我相信您会发现 Windows 环境变量实际上是不区分大小写的,因此键是大写的以避免混淆。这样,没有任何区分大小写概念的 Windows 脚本可以使用与其他所有内容相同的变量。

于 2008-09-03T21:47:19.367 回答
2

First, to solve your problem, I believe using backticks around set and parsing it yourself will work. On my Windows system, this script worked just fine.

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

In the camel book, the advice in Chapter 25: Portable Perl, the System Interaction section is "Don't depend on a specific environment variable existing in %ENV, and don't assume that anything in %ENV will be case sensitive or case preserving. Don't assume Unix inheritance semantics for environment variables; on some systems, they may be visible to all other processes."

于 2008-09-16T15:52:13.413 回答
2

据我记得,对环境变量使用 ALL_CAPS 是 Windows 和 *NIX 世界的推荐做法。我的猜测是 Perl 只是使用某种遗留 API 来访问环境,因此只检索变量的大写名称。

在任何情况下,你都不应该依赖这样的东西,更何况如果你要求你的用户设置变量,想象一下一个简单的拼写错误的变量会产生多少恶化和混乱!您必须记住,一些将保持无名的操作系统还没有学会如何处理区分大小写的文件......

于 2008-09-03T00:28:58.800 回答
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。如果您正在调用许多外部模块并希望在它们之间跟踪相同的变量,那么工厂模式可能会起作用,这样您就不会破坏 DRY,并且能够在多个模块之间使用区分大小写的哈希。唯一的窍门是让这些变量在工厂的所有对象中保持更新,但我相信你可以解决这个问题。

于 2008-09-09T15:31:46.610 回答