Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Perl不解释记号中的值,称之为未定义值_Xml_Perl_Xml Simple - Fatal编程技术网

Xml Perl不解释记号中的值,称之为未定义值

Xml Perl不解释记号中的值,称之为未定义值,xml,perl,xml-simple,Xml,Perl,Xml Simple,我正在编写一个子例程,它使用模块从配置文件中提取信息 XML文件具有以下结构 <main> <server hostname="blahblah" ... more_attributes="more"/> <server etc./> <server etc./> </main> 应将当前计算机的主机名插入最后一组括号中。然而,当执行我得到的代码时 Can't use an undefined value as a HAS

我正在编写一个子例程,它使用模块从配置文件中提取信息

XML文件具有以下结构

<main>
  <server hostname="blahblah" ... more_attributes="more"/>
  <server etc./>
  <server etc./>
</main>
应将当前计算机的主机名插入最后一组括号中。然而,当执行我得到的代码时

Can't use an undefined value as a HASH reference
您应该使用来转储来自的输出,如下所示:

use Data::Dumper;
# Retrieve your data structure via XML::Simple. Then...

print Dumper $xmlObject;
chomp( my $h = `hostname` );
my %systemHash = %{$xmlObject->{SERVER}->{$h}};
您将看到,它没有创建您期望的结构,这就是为什么
不能使用未定义的值作为散列引用消息的原因。该消息表示
$xmlObject
未定义,或者
$xmlObject->{SERVER}
未定义。将错误描述为:

必须指定用作硬引用或符号引用的值 必须是定义的值。这有助于掩盖一些潜在的错误

您将未定义的值视为哈希引用。如前所述,原因可能是生成的XML::Simple结构与您的期望不同

XML::Simple并不像它的名字所暗示的那样简单,也不像人们希望的那样简单。目前它自己的文档不鼓励使用它。有一些配置选项可以帮助规范化它生成的结构,但是在没有看到更多的XML和用于读取XML的代码的情况下,我可以给出尽可能详细的解释。关于如何解析XML,最好的建议是使用更可靠的模块。两个非常常见且备受推崇的替代方案是和

您的代码中还有一个bug,您接下来会遇到:系统调用“
hostname
”返回的主机名末尾有一个换行符,因此您需要一个名为:

"somehost\n"
…当你真的想要某个主机时。我怀疑你没有指望。至少,您需要以下内容:

use Data::Dumper;
# Retrieve your data structure via XML::Simple. Then...

print Dumper $xmlObject;
chomp( my $h = `hostname` );
my %systemHash = %{$xmlObject->{SERVER}->{$h}};
或者这个:

use Sys::Hostname;
my %systemHash = %{$xmlObject->{SERVER}->{hostname()};
我更喜欢后者,因为它更便于携带,并且是模块,所以您的系统上已经有了它。它的输出将不需要咀嚼。

您应该使用以下方式从中转储输出:

use Data::Dumper;
# Retrieve your data structure via XML::Simple. Then...

print Dumper $xmlObject;
chomp( my $h = `hostname` );
my %systemHash = %{$xmlObject->{SERVER}->{$h}};
您将看到,它没有创建您期望的结构,这就是为什么
不能使用未定义的值作为散列引用消息的原因。该消息表示
$xmlObject
未定义,或者
$xmlObject->{SERVER}
未定义。将错误描述为:

必须指定用作硬引用或符号引用的值 必须是定义的值。这有助于掩盖一些潜在的错误

您将未定义的值视为哈希引用。如前所述,原因可能是生成的XML::Simple结构与您的期望不同

XML::Simple并不像它的名字所暗示的那样简单,也不像人们希望的那样简单。目前它自己的文档不鼓励使用它。有一些配置选项可以帮助规范化它生成的结构,但是在没有看到更多的XML和用于读取XML的代码的情况下,我可以给出尽可能详细的解释。关于如何解析XML,最好的建议是使用更可靠的模块。两个非常常见且备受推崇的替代方案是和

您的代码中还有一个bug,您接下来会遇到:系统调用“
hostname
”返回的主机名末尾有一个换行符,因此您需要一个名为:

"somehost\n"
…当你真的想要某个主机时。我怀疑你没有指望。至少,您需要以下内容:

use Data::Dumper;
# Retrieve your data structure via XML::Simple. Then...

print Dumper $xmlObject;
chomp( my $h = `hostname` );
my %systemHash = %{$xmlObject->{SERVER}->{$h}};
或者这个:

use Sys::Hostname;
my %systemHash = %{$xmlObject->{SERVER}->{hostname()};
我更喜欢后者,因为它更便于携带,并且是模块,所以您的系统上已经有了它。它的输出不需要咀嚼。

首先,请不要使用。它自己的文件中这样说

不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别推荐使用XML::LibXML

该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果

您还应该使用检查任何子例程调用或shell命令的结果。看起来是这样的

perl -MData::Dump -E'dd `hostname`'
在我的系统上显示

"Samurai-U\n"
希望你现在看到问题了?backticks返回的字符串后面有一个换行符,在
$xmlObject
散列中有一个元素有这样一个键。你可以用它来修理

chomp(my $host = `hostname`)
然后你就可以写了

my %systemHash = %{ $xmlObject->{SERVER}{$host} }
最后,像这里这样复制所有第一级哈希是浪费的

my %systemHash = %{$xmlObject->{SERVER}->{`hostname`}}
您不会继续显示您想要使用这些信息做什么,但一般来说,使用


更新

<main>
  <server hostname="server1" more_attributes="more"/>
  <server hostname="server2" more_attributes="more"/>
  <server hostname="server3" more_attributes="more"/>
</main>
最好使用适当的XML解析模块

下面是一个使用

输入文件

<main>
  <server hostname="server1" more_attributes="more"/>
  <server hostname="server2" more_attributes="more"/>
  <server hostname="server3" more_attributes="more"/>
</main>
首先,请不要使用。它自己的文件中这样说

不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别推荐使用XML::LibXML

该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果

您还应该使用检查任何子例程调用或shell命令的结果。看起来是这样的

perl -MData::Dump -E'dd `hostname`'
在我的系统上显示

"Samurai-U\n"
希望你现在看到问题了?backticks返回的字符串后面有一个换行符,在
$xmlObject
散列中有一个元素有这样一个键。你可以用它来修理

chomp(my $host = `hostname`)
之后你就可以写了