在PERL,NET :: LDAP中,我正在尝试使用 -
my $psearch-$ldap->search(
base => $my_base,
attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
filter => "(&(mail=*)(!(employeeNumber=9*)) (&(physicalDeliveryOfficeName=100)) (|(physicalDeliveryOfficeName=274)))");
说“给我每个人一个邮件条目,员工编号不以9开头,而physicalDeliveryOfficeName是100或274”。
我可以使用100或仅使用274来使用它,但我似乎无法弄清楚如何指定100 OR 274。
我似乎无法找到正确的滤芯,准备拉出我的头发......请帮助!!
答案 0 :(得分:15)
我无法对此进行测试,但在我们使用 infix 表示法时,LDAP查询使用前缀表示法。想象一下,如果你想要的东西是 dog 或 cat 。在 infix 表示法中,它看起来像这样:
((ANIMAL = "cat") OR (ANIMAL = "dog"))
使用前缀表示法,布尔运算符位于查询的开头:
(OR (ANIMAL = "cat") (ANIMAL = "dog"))
当每个布尔值执行两次以上的检查时,前缀表示法的优点就出现了。在这里,我正在寻找的东西是 cat , dog 或 wombat :
(OR (ANIMAL = "cat") (ANIMAL = "dog") (ANIMAL = "wombat"))
请注意,我在语句前面只需要一个布尔运算符。这将 OR 连接在一起的所有三个语句。使用我们的标准中缀表示法,我必须有第二个 OR 运算符:
((ANIMAL = "cat") OR (ANIMAL = "dog") OR (ANIMAL = "wombat"))
前缀符号由波兰数学家Jan Lukasiewicz于1924年在华沙大学创建,因而被称为 Polish Notation 。后来发现,如果方程式是用 postfix 表示法编写的,那么计算机可以从前到后运行方程,这与波兰表示法相反。因此, 反向 波兰表示法(或RPN)诞生了。
早期的HP计算器使用了 RPN 符号,后来在20世纪70年代早期成为了Geek Sheik的东西。想象一下,当您将计算器交给某人并且他们不知道如何使用它时,您会获得大脑优势感。当时冷却的唯一方法是拥有Curta。
好的,足够走怀旧路。让我们回到问题......
构建中缀操作的最简单方法是构建所需内容的树形图。因此,您应该将LDAP查询描绘为树:
AND
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
/ | \
OR employee!=9* mail=*
/ \
/ \
/ \
/ \
/ \
phyDelOfficeName=100 phyDelOfficeName=274
要基于此树构建查询,请从树的底部开始,然后逐步向上运行。我们树的底部是查询的 OR 部分:
(OR (physicalDeliveryOfficeName = 100) (physicalDeliveryOfficeName = 274))
使用LDAP的 OR 运算符,管道(|
)并删除多余的空格,我们得到:
(|(physicalDeliveryOfficeName = 100)(physicalDeliveryOfficeName = 274))
当我构建LDAP查询时,我喜欢将每个部分保存为Perl标量变量。它使它更容易使用:
$or_part = "|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)";
注意我已经离开了外圈或括号。当您将所有查询串起来时,外部括号集将返回。然而,有些人还是把它们放了。额外的一组括号不会损害LDAP查询。
现在查询的其他两部分:
$mailAddrExists = "mail=*";
$not_emp_starts_9 = "!(employee=9*)";
而且,现在我们 AND 将所有三个部分组合在一起:
"(&($mailAddrExists)($not_emp_starts_9)($or_part))"
请注意,单个&符将它们编织在一起。我可以替换每个部分以查看完整查询:
(&(mail=*)(!(employee=9*))(|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)))
或者像这样:
my $psearch-$ldap->search(
base => $my_base,
attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
filter => "(&(mail=*)(!(employee=9*))(|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)))",
);
或零碎:
my $mail = "mail=*";
my $employee = "!(employee=9*)";
my $physicalAddress = "|(physicalDeliveryOfficeName=100)"
. "(physicalDeliveryOfficeName=274)";
my $psearch-$ldap->search(
base => $my_base,
attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
filter => "(&($mail)($employee)($physicalAddress))",
);
正如我之前所说,我无法测试这一点。我希望它有效。如果不出意外,我希望您了解如何创建LDAP查询,并了解如何自己完成。