繁体   English   中英

当我尝试打印包含带有冒号的键的嵌套哈希时,为什么会出现语法错误?

[英]Why do I get a syntax error when I try to print a nested hash that has keys containing colons?

我正在尝试打印嵌套数据结构的元素:

$VAR1 = {
  'SOAP:Body' => {
     'ns1:MT_DF_AssetMaster_Response' => {
       'SUBNUMBER' => {},
       'ASSETCREATED' => {
                         'SUBNUMBER' => {},
                         'ASSET' => {},
                         'COMPANYCODE' => {}
                       },
       'RETURN' => {
                   'PARAMETER' => 'timedependentdata',
                   'MESSAGE_V2' => {},
                   'ID' => 'BAPI1022',
                   'MESSAGE_V1' => 'HW5790',
                   'ROW' => '0',
                   'TYPE' => 'E',
                   'FIELD' => 'plate_no',
                   'LOG_NO' => {},
                   'MESSAGE_V3' => {},
                   'SYSTEM' => 'xxx',
                   'MESSAGE' => 'Invalid date transferred for field xxx:',
                   'MESSAGE_V4' => {},
                   'NUMBER' => '041',
                   'LOG_MSG_NO' => '000000'
                 },
       'xmlns:ns1' => 'urn:ariba.com:xi:OnDemand:Asset',
       'ASSET' => {},
       'COMPANYCODE' => {}
     }
   },
  'xmlns:SOAP' => 'http://schemas.xmlsoap.org/soap/envelope/',
  'SOAP:Header' => {}
};

print "$data->{SOAP:Body}->{ns1:MT_DF_AssetMaster_Response}->{ASSETCREATED}=>{ASSET}\n";

但是我收到语法错误:

./asset_creation.pl第85行中的语法错误,靠近“ {SOAP:”

我怎样才能解决这个问题?

你必须写这样的东西

my $asset = $data->{'SOAP:Body'}{'ns1:MT_DF_AssetMaster_Response'}{ASSETCREATED}{ASSET};

print %$asset ? "Asset is NOT empty\n" : "Asset is empty\n";

以下是通过引用进行哈希查找的语法:

REF->{IDENTIFIER}
REF->{EXPR}

ns1:MT_DF_AssetMaster_Response既不是有效的标识符,也不是有效的表达式。 更换

->{ns1:MT_DF_AssetMaster_Response}

->{'ns1:MT_DF_AssetMaster_Response'}

Perl允许在下标内的表达式为数组或哈希。 例如,一个变量:

$array[ $i ]

或加法的结果:

$array[ $i + $offset ]

或者其他的东西

$array[ cos( $i ) ]

哈希值也一样:

$hash{ $key }

点仍然是字符串连接运算符:

$hash{ $key . $prefix }

当裸词混在一起时,很难发现:

$hash{first.last}

在这种情况下,:仍然是名称空间分隔符的一部分。 Perl认为大括号中的表达式还不够用,所以它抱怨:

$hash{ SOAP:Body }   # !!! Error

SOAP:Body必须被引用:本:无报价哈希键不能使用:

print $data->{'SOAP:Body'}->{'ns1:MT_DF_AssetMaster_Response'}

您还应该在打印语句中删除变量名周围的" " 否则,hashref取消引用将不起作用。 您的输出将类似于

HASH(0x123456)->{SOAP:Body}->{ns1:MT_DF_AssetMaster_Response}

...但是如果第85行不是print命令,您可能仍然会遇到另一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM