Darwin Streaming Server 在 os x 上安装问题

问题描述 投票:0回答:2

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

文件 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"});

它工作正常,打印“hello”。

知道问题出在哪里吗?

macos perl darwin
2个回答
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};

最佳实践是在两个键之间使用 ->。键的 " 或 ' 引号也是可选的,如果键是普通单词的话

但是通过环境变量传递所有内容感觉是错误的。他们可能无法保存 OSX 上的引用(我不知道)。您可能希望将字符串存储提取到包含文件中并通过

require. 加载它

有关 Perl 的更多信息,请参阅

http://www.perlmaven.com/http://learn.perl.org


0
投票
修复代码:

$$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"}; sub GetMessageHash { return $$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}; }

参考:

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

© www.soinside.com 2019 - 2024. All rights reserved.