2016-01-11 68 views
3

我在散列時遇到了一些麻煩。我需要獲得key =>值對的版本列表到哈希中,但不斷收到錯誤。下面的代碼是我最近的嘗試。一些字符串已被更改,不需要的代碼不包括在內。Perl散列中元素的奇數

我已經看遍了所有的網絡,但一直沒能找到任何可以幫助我的東西。我用了很長時間的Perl,但沒有使用哈希和數組。我的大部分Perl經驗都與正則表達式和shell執行有關。如果我使用的是PHP,那麼我只是使用多維數組,但這是Perl,並且我正在編寫的腳本比所示的腳本還多,或者我會切換到PHP。

我很欣賞無論誰花時間幫忙。謝謝!

sub sub1 { 

    # Read file which populates @rows with each line. 

    my %data; 
    for (my $i=2; $i <= scalar @rows - 1; $i++) { 
     $ver =~ s/\s//m; 
     $data{ $ver } = [ 
      'version', $ver, 
      'available', $table_tree->cell($jt,1)->as_text, 
      'bsupport', $table_tree->cell($jt,2)->as_text, 
      'ssupport', $table_tree->cell($jt,3)->as_text, 
      'eol', $table_tree->cell($jt,3)->as_text, 
      'utype', $table_tree->cell($jt,5)->as_text, 
      'lreleases', $table_tree->cell($jt,7)->as_text 
     ]; 
    }; 
    return %data; 
} 

sub check_ { 

    # line 199 follows 

    my (%hash) = @_; 
    print Dumper (\%hash)."\n"; 
} 

my %data = sub1($file); 
check_(%data); 

警告:

Odd number of elements in hash assignment at ./file.pl line 199 (#1) 
(W misc) You specified an odd number of elements to initialize a hash, 
which is odd, because hashes come in key/value pairs. 

的哈希%傾倒時是:

$VAR1 = { 
     'string1' => [ 
       'version', 
       'string1', 
       'available', 
       'stringa', 
       'bsupport', 
       'stringb', 
       'ssupport', 
       'stringc', 
       'eol', 
       'stringd', 
       'utype', 
       'stringe', 
       'lreleases', 
       'stringf' 
      ], 
    'string2' => [ 
       'version', 
       'string2', 
       'available', 
       'stringa', 
       'bsupport', 
       'stringb', 
       'ssupport', 
       'stringc', 
       'eol', 
       'stringd', 
       'utype', 
       'stringe', 
       'lreleases', 
       'stringf' 
      ], 
    'string3' => [ 
       'version', 
       'string3', 
       'available', 
       'stringa', 
       'bsupport', 
       'stringb', 
       'ssupport', 
       'stringc', 
       'eol', 
       'stringd', 
       'utype', 
       'stringe', 
       'lreleases', 
       'stringf' 
      ], 
    # ... 
} 

我本來試圖讓我一直如下。其中$ VAR1 = {'stringN'=> {...}將是具有任意數量的key =>值對的任何數字,但也會得到相同的錯誤。我有它的工作,但它總是會產生錯誤。

$VAR1 = { 
    'string1' => { 
       'version' => 'string1', 
       'available' => 'stringa', 
       'bsupport' => 'stringb', 
       'ssupport' => 'stringc', 
       'eol' => 'stringd', 
       'utype' => 'stringe', 
       'lreleases' => 'stringf' 
      }, 
    'string2' => { 
       'version' => 'string2', 
       'available' => 'stringa', 
       'bsupport' => 'stringb', 
       'ssupport' => 'stringc', 
       'eol' => 'stringd', 
       'utype' => 'stringe', 
       'lreleases' => 'stringf' 
      }, 
    'string3' => { 
       'version' => 'string3', 
       'available' => 'stringa', 
       'bsupport' => 'stringb', 
       'ssupport' => 'stringc', 
       'eol' => 'stringd', 
       'utype' => 'stringe', 
       'lreleases' => 'stringf' 
      } 
    # ... 
} 

回答

3

這是因爲您正在使用[這是匿名數組構造函數。改爲使用{

如果你做了可能會有點更地道:

$data{ $ver } = { 
    version => $jver, 
    available => $table_tree->cell($jt,1)->as_text, 
}; 

哦,縮進代碼。那for循環沒有完成你(可能!)認爲它做的地方。特別是 - 檢查return發生的位置。 (和$jt設置爲 - 它看起來與$i無關)

+0

無關,但在'更加習慣'的標題下:'爲我$(2 .. $#行){' –

+0

我選擇了這個答案,因爲這是創建哈希的正確方法。我的警告消息實際上來自一個空數組,該數組是通過添加一個斷點並使用perl -d script.pl找到的。 –