perl Net::LDAP::LDIF читать ldif из переменной строки

Обычно я загружаю parse 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 непосредственно из переменной строки. поэтому код будет выглядеть так:

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

так, как это сделать правильно?

спасибо и извините за этот глупый вопрос. :) БР//

ИСХОДНАЯ ИДЕЯ Моей целью является создание скрипта, который детально сравнивает данные LDIF до и после (от dn до значений атрибутов, одно за другим). сами данные LDIF действительно огромны, около 10 ГБ или больше на файл.

* Итак, у меня возникла идея прочитать файл для каждого DN и сравнить его до и после. анализ каждого DN хранится в $variable_before и $variable_after. вот почему мне действительно нужны данные из переменной $, потому что «данные формата LDIF» поступают из вывода предыдущего процесса. *

Мне нужен LDAP::LDIF, чтобы упростить преобразование строки LDIF в хэш-ссылку perl.

Я избегаю использования временного файла, потому что "данных DN" действительно много, обработка будет медленнее при использовании временного файла.


person guete    schedule 23.06.2015    source источник


Ответы (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 подходит для того, что вы хотите сделать?

person Georgi Rangelov    schedule 23.06.2015
comment
Кстати, не могли бы вы привести пример использования $variable вместо *DATA? Я обновляю вопрос фоновой идеей, зачем мне это нужно. все равно спасибо, оценил :) - person guete; 23.06.2015

Вы можете открыть ссылку SCALAR:

Perl построен с использованием PerlIO по умолчанию. Если вы не изменили это (например, при сборке Perl с помощью Configure -Uuseperlio ), вы можете открывать дескрипторы файлов непосредственно для скаляров Perl через:

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

И согласно Net::LDAP::LDIF документация:

ФАЙЛ может быть именем файла или уже открытым дескриптором файла. Если ФАЙЛ начинается или заканчивается символом | то FILE будет передан непосредственно для открытия.

Итак, чтобы ответить на ваш вопрос:

open(my $string_fh, '<', $var_ldif) || die("failed to open: $?");
my $ldif = Net::LDAP::LDIF->new($string_fh, 'r', onerror => 'die');
person Lucas    schedule 24.06.2016