2010-08-03 84 views
1

Perl新手在這裏...我用這個工作perl腳本的一些HASH代碼的幫助,我只需要幫助理解代碼,如果它可以寫的方式,我會理解使用HASHES更容易或視覺?幫助理解perl hash

總之,該腳本執行一個正則表達式來過濾日期,剩下的正則表達式將提取與該日期相關的數據。

use strict; 
use warnings; 
use constant debug => 0; 
my $mon = 'Jul'; 
my $day = 28; 
my $year = 2010; 
my %items =(); 

while (my $line = <>) 
{ 
    chomp $line; 
    print "Line: $line\n" if debug; 
    if ($line =~ m/(.* $mon $day) \d{2}:\d{2}:\d{2} $year: ([a-zA-Z0-9._]*):.*/) 
    { 
     print "### Scan\n" if debug; 
     my $date = $1; 
     my $set = $2; 
     print "$date ($set): " if debug; 
     $items{$set}->{'a-logdate'} = $date; 
     $items{$set}->{'a-dataset'} = $set; 
     if ($line =~ m/(ERROR|backup-date|backup-size|backup-time|backup-status)[:=](.+)/) 
     { 
      my $key = $1; 
      my $val = $2; 
      $items{$set}->{$key} = $val; 
      print "$key=$val\n" if debug; 
     } 
    } 
} 

print "### Verify\n"; 
for my $set (sort keys %items) 
{ 
    print "Set: $set\n"; 
    my %info = %{$items{$set}}; 
    for my $key (sort keys %info) 
    { 
     printf "%s=%s;", $key, $info{$key}; 
    } 
    print "\n"; 
} 

什麼我想了解的是這些行:

 $items{$set}->{'a-logdate'} = $date; 
     $items{$set}->{'a-dataset'} = $set; 

又一次幾行下來:

 $items{$set}->{$key} = $val; 

這是哈希引用的例子嗎?散列哈希?
我想我很困惑與使用{$}集的:-(

+2

如果你還沒有閱讀[perldoc perlreftut](http://perldoc.perl.org/perlreftut.html)和[perldoc perldsc](http://perldoc.perl.org/perldsc.html),他們會好的地方開始。 – hobbs 2010-08-03 23:42:38

+0

@hobbs - 謝謝,這裏有一些很好的例子。 – jdamae 2010-08-04 02:42:43

回答

4

%items是哈希引用(概念,哈希散列)的哈希值。$set是關鍵到%items然後你回來另一個哈希,其被添加到連鍵'a-logdate''a-dataset'

(修正基於評論)

+0

感謝您的回覆。當你說「那麼你回來另一個哈希」與2個新鍵...然後它是否指向自己? – jdamae 2010-08-03 18:30:10

+0

不,從概念上講,項目中的每個散列鍵值對都是另一個散列的關鍵。 $ set是%項目的關鍵。你得到每個密鑰的另一個散列。它就像一個兩層樹。 $ set是第一級,然後a-logdate是第二級。 – 2010-08-03 19:01:09

2

婁佛朗哥的答案是接近的,只有一個小排印錯誤—哈希引用的哈希%items,不$items這是參考紅色爲$items{key}當您從%items檢索值時,因爲您檢索的值是標量(在本例中是散列引用),但$items將是一個不同的變量。

+0

根據此信息更正了我的答案 - 謝謝。 – 2010-08-03 19:01:37