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

但不是从文件加载,我需要直接从变量 string 加载 LDIF 格式文件。所以代码看起来像:

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 到属性值,一一进行)。LDIF 数据本身非常庞大,每个文件大约 10GB 或更多。

*所以我想到了按 DN 读取文件,并在前后进行比较。每个 DN 的解析存储在 $variable_before 和 $variable_after 中。这就是为什么我实际上需要来自 $ 变量的数据,因为“LDIF 格式数据”来自上一个过程的输出。*

我需要 LDAP::LDIF 以便更容易地将 LDIF 字符串解析为 perl hashref。

我避免使用临时文件,因为“DN 数据”非常多,如果使用临时文件,处理速度会变慢。

4

2 回答 2

2

您可以将您拥有的数据附加到脚本的末尾并从 DATA 文件句柄中读取( Net::LDAP::LDIF 文档说明第一个参数可以是文件名或文件句柄)

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

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

__DATA__
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

另一种解决方案是将 $var_ldif 的内容写入临时文件。

您确定 NET::LDAP::LDIF 是您想要做的正确模块吗?

于 2015-06-23T11:01:40.497 回答
0

您可以打开一个标量参考:

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 回答