2013-04-25 219 views
2

消失,我認爲我的Perl是生鏽:)默認哈希鍵在Perl

這下面的腳本應該通過包含LDAP記錄文本文件的目錄遍歷特定用戶提取特定的信息。如果'productfamily'屬性不存在於文件中,我遇到了將'group'散列鍵從散列引用中刪除的問題。

#!/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 
use File::Basename; 

sub extract_val { 
    my $line = shift; 
    return (split /\:/, $line)[1]; 
} 

my @ldif_files = <tmp/*.ldif>; 
my $line_ctr = 0; 
my @record_ctr; 

for my $ldif_file (@ldif_files) { 

    open my $fh,'<', $ldif_file or die "Cannot open file: $!"; 
    my @contents = <$fh>; 
    close $fh; 

    my $user_record = { 
     'file' => basename $ldif_file, 
     'group' => 'BP', 
     'uid'  => '', 
     'fname' => '', 
     'lname' => '', 
     'company' => '', 
    }; 

    for my $line (@contents){ 
     chomp $line; 
     $user_record->{'uid'}  = extract_val($line) if $line =~ /^uid\:/; 
     $user_record->{'fname'} = extract_val($line) if $line =~ /^givenname\:/; 
     $user_record->{'lname'} = extract_val($line) if $line =~ /^sn\:/; 
     $user_record->{'company'} = extract_val($line) if $line =~ /^o\:/; 
     $user_record->{'group'} = 'EU' if $line =~ /^productfamily\:/; 
    } 

    print Dumper $user_record; 

    last if $line_ctr++ == 10; 
} 

輸出示例

下面是從輸出的兩個有代表性的樣品。

如果LDAP記錄中存在productfamily屬性,則顯示'group'散列鍵。

$VAR1 = { 
    'group' => 'EU', 
    'uid' => 'abcdef', 
    'lname' => 'SMITH', 
    'fname' => 'JOHN', 
    'file' => 'abcdef.ldif', 
    'company' => 'Some Company' 
    }; 

如果productfamily屬性在LDAP記錄中不存在,'group'散列鍵會丟失。

$VAR1 = { 
    'uid' => 'uvwxyz', 
    'lname' => 'Bar', 
    'fname' => 'Foo', 
    'file' => 'uvwxyz.ldif', 
    'company' => 'Another Company' 
    }; 

Solaris 5.9上的Perl版本爲5.8.5。

大約有6000個文件,但我將循環迭代次數限制爲10次,因爲問題在我的數據文件中出現得早。

+0

嘗試單步執行perl調試器中的代碼:'perl -d program.pl'。它足夠小的代碼塊,你應該能夠在5分鐘左右的時間內找出它。 – 2013-04-25 21:53:09

回答

4

basename沒有原型,所以它會記錄你所有的散列條目。你寫的東西相當於

my $user_record = { 
    'file' => basename($ldif_file, 
         'group' => 'BP', 
         'uid'  => '', 
         'fname' => '', 
         'lname' => '', 
         'company' => ''), 
}; 
+0

不錯!就是這樣。我用parens包圍了$ ldif_file,而且鍵保持不變。我知道我的Perl正在生鏽:) – JTP 2013-04-25 22:00:38