2013-09-29 21 views
-1

我在編輯Perl代碼,並且我添加了需要傳遞散列的子例程。不是在perl腳本中出現錯誤的ARRAY引用

%OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash); 

sub Parsing { 

my (%fileHash,%paramHash)=(@ARG); 
my %resultHash; 
    foreach my $file (keys %fileHash) { 
    my (@fileParam)[email protected]{$fileHash{$file}}; 
    my (@fileStates)=grep(/^state:/,@fileParam); 

運行時,我得到的錯誤消息:

完全不/vobs/cores/periph/blsp_prj/scripts/flow_result_parser_with_flag_orig.pl線數組引用193. ,其指的是:

foreach my $ file(keys%fileHash){

你能解釋一下代碼中的錯誤嗎?

回答

1

你的代碼有一堆問題。首先,請打開use strictuse warnings

  • 你是通過你的兩個參數\%OrigFileHash,\%OrigParamHash作爲參考,這是做的,因爲它們是哈希正確的事情。但是在你的sub中,你將它們分配給my (%fileHash,%paramHash)=(@ARG)

    通過這種方式,您最終得到了%fileHashundef中的一鍵散列%paramHash

    print Dumper \%fileHash, %paramHash; 
    
    $VAR1 = { 
        'HASH(0x5cad8c)' => { 
        'xxx' => 'asdf' 
        } 
    }; 
    

    如你所見,那不是你想要的。

  • 但是,您正在討論的實際錯誤消息不是來自foreach行。它來自下面的行,你有my (@fileParam)[email protected]{$fileHash{$file}}。正如我們在上面的Dumper輸出中看到的,沒有數組ref,就像錯誤消息所述。一旦我們解決了分配問題,這將消失。您需要將引用的參數分配爲標量,因此仍然是引用。如果你喜歡使用哈希函數,你可以解引用它們。我把它結合到以下幾行。

    my %fileHash = %{ shift }; 
    my %paramHash = %{ shift }; 
    
+0

'@ ARG'是'use _'下的'@ _'的別名;' – ysth

+0

謝謝@ysth。我沒有意識到這一點。從未使用過「英語」。 – simbabque

1

那麼,哪裏@ARG從何而來呢?相反,你應該使用@_得到轉移到subroutine.And的價值,你這是什麼意思我(%fileHash,%paramHash) =(@ ARG); ? Perl中使用哈希引用,而不是散體轉移到功能,所以,你不能使用%fileHash,而只是一個標值存儲哈希ref.So,更改您的代碼:

%OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash); 

sub Parsing { 

my ($fileHash,$paramHash)[email protected]_; 
my %resultHash; 
    foreach my $file (keys %$fileHash) { 
    my (@fileParam)=$fileHash->{$file}; 
    ..... 
+0

'@ ARG'是'@ _'的別名,在'use English;'下 – ysth

+0

嗯,它看起來非常像高端功能。但我不習慣它。 – wuchang

相關問題