Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Передача handlera на соединение в пакет


Автор: Zubilo 13.12.2007, 13:17
Добрый день!
    Если создавать LDAP соединение и по нему отправлять запросы, то все работает, если это все написано одной программой(одним Perl файлом):
Код

#!/usr/bin/perl -w
use strict;
use Net::LDAP;
use Net::LDAP::Control;

my ($debug, $sth, $entry, $dept, $query, $rosteritem, $rostergroup,
    @roster, $inneritem, $res, $jabber_domain);

my $basedn     = "DC=company,DC=msk";
my $ldapserver = "server.company.msk";
my $disname    = "CN=admin,CN=users,DC=company,DC=msk";
my $ldappass   = "1111";

# Connection to LDAP server for futher fethcing and modifying persons attributes
my $ldap = Net::LDAP->new( $ldapserver, debug => 0 ) || die "$!";
my $mesg = $ldap->bind ($disname, password => $ldappass, version => 3 ) || die;
my $search = $ldap->search(
             base   => "$basedn",
             scope  => "one",
             filter => "(&(objectClass=organizationalUnit))" );
# fetch the department names
foreach $entry ($search->entries) {
    $dept = $entry->get_value('name');
    print "$dept\n";
}
$ldap->unbind;


если ничего не удалил лишнего, то вобщем так это работает.

А если передавать  $ldap в процедуру пакета,а там его соответственно получать с помощью shift, то на запросы к серваку по этому handler он отвечает так: Use of uninitialized value in string at ...
Все вроде понятно, что у них, если я правильно понимаю, различные адресные пространства для хранения переменных(различные пространства имен переменных), и что в пакете этот handler указывает на не свой участок памяти. Существует ли возможность каким либо образом реализовать передачу handler'а в процедуру пакета?

Автор: Ramirez 13.12.2007, 14:36
А покажите код, как передаете, как принимаете. По идее все должно работать.

Автор: Zubilo 13.12.2007, 14:59
Это код, который вызывает процедуру из модуля:
Код


#!/usr/bin/perl -w
use strict;
use Net::LDAP;
use Net::LDAP::Control;
use Mail::Sender;
use DBI;
use test qw (test_sub sub_search);

my ($debug, $sth, $entry, $dept, $query, $rosteritem, $rostergroup,
    @roster, $inneritem, $res, $jabber_domain);

my $basedn     = "DC=xxx,DC=msk";
my $ldapserver = "xxxxx.xxx.msk";
my $disname    = "CN=xxx,CN=users,DC=xxxx,DC=msk";
my $ldappass   = "xxxxx";

# Connection to LDAP server for futher fethcing and modifying persons attributes
my $ldap = Net::LDAP->new( $ldapserver, debug => 0 ) || die "$!";
my $mesg = $ldap->bind ($disname, password => $ldappass, version => 3 ) ||
die;

die $mesg->error if $mesg->code;

my $h=sub_search($ldap);

$ldap->unbind;





А вот модуль:
Код

package test;
require Exporter;
@ISA = qw (Exporter);
@EXPORT_OK = qw (test_sub sub_search);

sub test_sub {
    my $p = shift;
    $p = $p*$p;
    return $p;
}
my $t=1;

sub sub_search{

my $ldap=shift;

my $dept;
my $entry;
print "pack ldap=$ldap\n";

my $search = $ldap->search(
             base   => "$basedn",
             scope  => "one",
             filter => "(&(objectClass=organizationalUnit))" );

# fetch the department names
foreach $entry ($search->entries) {

    $dept = $entry->get_value('name');
   # my $mm = $entry->get_value('mail');
   # my @mb= $entry->get_value('member');
    #print "ou=$dept, basedn= $basedn\n";

#    fetchperson("ou=$dept,$basedn", "one", "$dept"); 
        print "\t\t$dept\n";
}

        
        return $t;
}




1;



Автор: Zubilo 14.12.2007, 10:35
Люди! Помогите!!! Как сделать чтобы все заработало?

Автор: Ramirez 14.12.2007, 15:22
Ваш код у меня работает, без изменений.

perl, v5.8.8 built for i386-freebsd-64int
Net::LDAP v 0.34



Автор: Zubilo 18.12.2007, 11:58
И у меня заработал, странно. Заново все переписал и заработал.
Может где косячил. 
Всем спасибо, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)