2

私の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;
}

出力例

出力からの 2 つの代表的なサンプルを次に示します。

productfamily 属性が LDAP レコードに存在する場合、'group' ハッシュ キーが存在します。

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

productfamily 属性が LDAP レコードに存在しない場合、「グループ」ハッシュ キーがありません。

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

Perl のバージョンは、Solaris 5.9 では 5.8.5 です。

約 6000 個のファイルがありますが、データ ファイルの早い段階で問題が発生するため、ループの反復回数を 10 回に制限しました。

4

1 に答える 1

4

basenameにはプロトタイプがないため、すべてのハッシュ エントリを丸呑みします。あなたが書いたものは同等です

my $user_record = {
   'file'    => basename($ldif_file,
                         'group'   => 'BP',
                         'uid'     => '',
                         'fname'   => '',
                         'lname'   => '',
                         'company' => ''),
};
于 2013-04-25T21:54:01.440 に答える