1

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

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

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

它工作正常,打印“你好”。

知道问题可能是什么吗?

4

2 回答 2

0

修复代码:

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

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

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

于 2017-02-15T10:14:58.210 回答
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

于 2016-04-25T05:43:06.523 回答