2

通常、次の方法を使用してファイルから解析ldifをロードします。

use Net::LDAP::LDIF;
use Net::LDAP::Entry;
use Data::Dumper;

my $ldif = Net::LDAP::LDIF->new( "filename.ldif", "r") or die "file not exits\n";
while( not $ldif->eof ( ) ) {
    $entry = $ldif->read_entry ( );
    print Dumper $entry;
}

ただし、ファイルからロードする代わりに、LDIF 形式のファイルを変数 string から直接ロードする必要があります。コードは次のようになります。

use Net::LDAP::LDIF;
use Net::LDAP::Entry;
use Data::Dumper;

my $var_ldif = "dn: cn=Sheri Smith,ou=people,dc=example,dc=com
objectclass: inetOrgPerson
cn: Sheri Smith
sn: smith
uid: ssmith
userpassword: sSmitH
carlicense: HERCAR 125
homephone: 555-111-2225";

my $ldif = Net::LDAP::LDIF->new( $var_ldif, "r") or die "file not exits\n";
while( not $ldif->eof ( ) ) {
    $entry = $ldif->read_entry ( );
    print Dumper $entry;
}

それで、それを正しく行う方法は?

このばかげた質問に感謝し、申し訳ありません。:)BR//

背景のアイデア 私の目標は、前後の LDIF データを詳細に (dn から属性値まで、1 つずつ) 比較するスクリプトを作成することです。LDIF データ自体は非常に巨大で、1 ファイルあたり約 10 GB 以上です。

* そこで、DN ごとにファイルを読み取り、前後で比較するというアイデアが浮かびました。各 DN の解析は、$variable_before と $variable_after に格納されます。「LDIF形式のデータ」は前のプロセスからの出力から来ているため、実際に$変数からのデータが必要なのはそのためです。*

LDIF 文字列を perl hashref に解析しやすくするには、LDAP::LDIF が必要です。

「DNデータ」が非常に多く、一時ファイルを使用すると処理が遅くなるため、一時ファイルの使用は避けます。

4

2 に答える 2

0

SCALAR refを開くことができます。

Perl は、デフォルトで PerlIO を使用してビルドされます。これを変更していない限り (Configure -Uuseperlio で Perl をビルドするなど)、次の方法でファイルハンドルを Perl スカラーに直接開くことができます。

open(my $fh, ">", \$variable) || ..

そして、Net::LDAP::LDIFのドキュメントに従って:

FILE は、ファイルの名前または既に開いているファイルハンドルです。FILE が | で開始または終了する場合 FILE は open に直接渡されます。

だから、あなたの質問に答えるには:

open(my $string_fh, '<', $var_ldif) || die("failed to open: $?");
my $ldif = Net::LDAP::LDIF->new($string_fh, 'r', onerror => 'die');
于 2016-06-24T14:29:51.300 に答える