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

时间:2016-05-09 06:46:38

标签: perl

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

$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:”

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

你必须写这样的东西

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

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

答案 1 :(得分:0)

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

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

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

->{ns1:MT_DF_AssetMaster_Response}

->{'ns1:MT_DF_AssetMaster_Response'}

答案 2 :(得分:0)

Perl允许在下标中使用数组或散列的表达式。例如,变量:

$array[ $i ]

或者添加的结果:

$array[ $i + $offset ]

或者其他什么

$array[ cos( $i ) ]

哈希是一样的:

$hash{ $key }

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

$hash{ $key . $prefix }

当你一起洗脑时很难发现:

$hash{first.last}

在这种情况下,:仍然是命名空间分隔符的一部分。 Perl认为你在括号中没有完成这个表达式所以它会抱怨:

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

答案 3 :(得分:-1)

必须引用

SOAP:Body:如果不引用哈希键,则不能使用:

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

您还应该删除print语句中变量名称周围的" "。 hashref-dereferencing不起作用。你的输出就像是

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

...但如果第85行不是print命令,则可能还有其他错误。