2016-10-04 6 views
0

どうすればこのエラーを修正できますか? @namesは「FOO」、「バー」を含むなぜ「使用中の厳密な参照」エラーの間に文字列( "FormFields")をHASH refとして使用できない

my %PDFData = (
foo => (
    FormFields => $FirstXML, 
    SignFields => $FirstXMLSign, 
), 
bar => (
    FormFields => $SecondXML, 
    SignFields => $SecondXMLign, 
), 
); 
my @names = @inputnames; 
my $formfields; 
my $signfields; 
for my $i (0 .. $#names) { 
$formfields .= $PDFData{ $names[$i] }{FormFields}; 
$signfields .= $PDFData{ $names[$i] }{SignFields}; 
}; 

ハッシュリファレンスとして文字列(「フォームフィールド」)を使用することはできませんが./xmltest.plラインで使用中「はrefs」263

答えて

2

$foo$barにリストを割り当てようとしています(割り当ての中の括弧を使って... parensはリストを表しています)。本当に割り当てたいものはハッシュ参照です。

Perlでは、データ構造の第1レベルの下にあるものは参照でなければなりません。 $foo$bar割り当てにおいて

$bar => (# <-- that parens denotes a list 
    FormFields => $SecondXML, 
    SignFields => $SecondXMLign, 
) # <-- 

、私は括弧に指摘括弧変更:$foo => {...}, $bar => {...}、無名ハッシュ(基準)を表します。

全体のハッシュ割り当ては次のようになります。

my %PDFData = (
    $foo => { 
     FormFields => $FirstXML, 
     SignFields => $FirstXMLSign, 
    }, 
    $bar => { 
     FormFields => $SecondXML, 
     SignFields => $SecondXMLign, 
    }, 
); 

あなたの代わりにハッシュのハッシュ内の配列を希望した場合、あなたは括弧[と無名配列を表し]、(参照)を使用したいです:

my %hash = (
    $foo => [ 
     1, 
     2, 
    ], 
    $bar => [ 
     3, 
     4, 
    ], 
); 

はまた、自身が複雑なデータ構造をトラブルシューティング/デバッグするための最初のステップとして、視覚を得るのを助けるためにData::Dumperを知るようになります。ここでは、ハッシュリファレンスの割り当て対(リスト)を持っていたものの一例です:

use warnings; 
use strict; 

use Data::Dumper; 

my %h = (
    first_level => (
     second_level => 1, 
    ), 
); 

print Dumper \%h; 

%h = (
    first_level => { 
     second_level => 1, 
    }, 
); 

print Dumper \%h; 

...と、ここでは、出力の違いです:

# the list assignment output 

$VAR1 = { 
     '1' => undef, 
     'first_level' => 'second_level' 
    }; 

# the proper hash ref method output 

$VAR1 = { 
     'first_level' => { 
         'second_level' => 1 
         } 
    };