Darwin Streaming Server安装问题os x

时间:2016-04-23 22:46:00

标签: macos perl darwin dss

我的问题与this回答中提到的问题相同。我一直试图理解代码,这就是我所学到的:

文件 parse_xml.cgi 失败,尝试从名为 messages 的文件(位于html_en目录中)获取消息(return $message{$name}) 。 $ messages值来自文件 adminprotocol-lib.pl 中的方法GetMessageHash

sub GetMessageHash
{
   return $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
}

文件 streamingadminserver.pl 中设置了$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}

$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"}

我对Perl一无所知所以我不知道问题是什么,因为我看到$messages{"en"}具有正确的值(如果我print($messages{"en"}{'SunStr'}我得到了值#34 ;太阳&#34))。

然而,如果我尝试做print($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}{'SunStr'}我什么也得不到。似乎$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}未设置

我尝试了这个简单的例子,它运行良好:

$ENV{"HELLO"} = "hello";
print($ENV{"HELLO"});

它工作正常,打印"你好"。

知道问题可能是什么?

2 个答案:

答案 0 :(得分:0)

看起来$messages{"en"}是一个 HashRef :指向一个存储键值存储的内存地址的指针。您甚至可以打印相关的内存地址:

perl -le 'my $hashref = {}; print $hashref;'
HASH(0x1548e78)

0x1548e78是地址,但它仅在同一个运行进程中有效。重新运行示例命令,每次都会得到不同的地址。

HASH(0x1548e78)也只是实际存储值的人类可读表示。设置$hashref2="HASH(0x1548e78)";不会创建真正的引用,只是人类可读字符串的副本。

您可以在两个脚本中使用print $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}轻松证明此理论。

Data::Dumper通常用于显示引用的哈希值(内存位置):

use Data::Dumper;
print Dumper($messages{"en"});
# or 
print Dumper($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"});

这也将显示是否可以在两个脚本中取消引用指针/引用。

您的问题的解决方案可能是传递值而不是HashRef:

$ENV{"QTSSADMINSERVER_EN_SUN"} = $messages{"en"}->{SunStr};

最佳做法是使用 - >两个键之间。密钥的“或”引用也是optional if the key is a plain word

但是通过环境变量传递一切感觉不对。他们可能无法持有OSX的参考资料(我不知道)。您可能希望将字符串存储提取到包含文件并通过 require 加载。

有关Perl的更多信息,请参阅http://www.perlmaven.com/http://learn.perl.org

答案 1 :(得分:0)

修复代码:

$$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"};

sub GetMessageHash
{
   return $$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"};
}

REF: https://github.com/guangbin79/dss6.0.3-linux-patch