我的问题与此答案中提到的问题相同。我一直在尝试理解代码,这就是我学到的:
它在文件parse_xml.cgi中失败,尝试从名为 messages 的文件(位于html_en目录中)获取消息 ( return $message{$name}
)。$messages值来自文件 adminprotocol-lib.pl 中GetMessageHash
的方法:
sub GetMessageHash
{
return $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
}
$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
在文件中设置 streamingadminserver.pl:
$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"}
我对Perl一无所知,所以我不知道问题可能是什么,因为我看到的$messages{"en"}
具有正确的值(如果我print($messages{"en"}{'SunStr'}
这样做,我会得到值"Sun"))。
但是,如果我尝试做print($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}{'SunStr'}
我什么也得不到。似乎$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
没有设置
我尝试了这个简单的例子,它工作正常:
$ENV{"HELLO"} = "hello";
print($ENV{"HELLO"});
它工作正常,打印"你好"。
知道问题可能是什么吗?
看起来$messages{"en"}
是一个HashRef:一个指向某个保存键值存储的内存地址的指针。您甚至可以打印关联的内存地址:
perl -le 'my $hashref = {}; print $hashref;'
HASH(0x1548e78)
0x1548e78 是地址,但它仅在同一个正在运行的进程中有效。重新运行示例命令,每次都会得到不同的地址。
HASH(0x1548e78)也只是真实存储价值的人类可读表示。设置 $hashref2="HASH(0x1548e78)";
不会创建真正的引用,只会创建人类可读字符串的副本。
您可以在两个脚本中使用print $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
轻松证明此理论。
Data::D umper 通常用于显示引用的哈希(内存位置)的内容:
use Data::Dumper;
print Dumper($messages{"en"});
# or
print Dumper($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"});
这也将显示是否可以在两个脚本中取消引用指针/引用。
问题的解决方案可能是传递值而不是 HashRef:
$ENV{"QTSSADMINSERVER_EN_SUN"} = $messages{"en"}->{SunStr};
最佳做法是在两个键之间使用 ->。如果键是纯单词,则键的 " 或 ' 引号也是可选的。
但是通过环境变量传递所有内容感觉是错误的。他们可能无法在OSX上保存引用(我不知道)。您可能希望将字符串存储提取到包含文件,并通过 require 加载它。
请参阅 http://www.perlmaven.com/或 http://learn.perl.org 以了解有关 Perl 的更多信息。
修复代码:
$$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"};
sub GetMessageHash
{
return $$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"};
}
裁判:https://github.com/guangbin79/dss6.0.3-linux-patch