请教关于锚定的问题

请教关于锚定的问题

dn:aaa
uid:123
cn:zh
dn:bbb
uid:456
cn:gz

判断dn:aaa与cn:bbb之间是否存在uid:456,正则表达式该如何写?
之前,我是这样写的:m/(\Q$current_DN\E .+?) \Q$_\E (.*?) (dn:|$)/sx   ($current_DN=dn:aaa,$_=uid:123)发现匹配上dn:bbb下的uid:456了

这个东西要这么复杂么?
连$_都上了(这里可能会出问题)
实际上不只这几行的,只是举个例子。就是搞不懂怎么匹配指定dn下的某行字符串
这个不行?

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
my $test_data = <<"TEST";
dn:aaa
uid:123
cn:zh
dn:bbb
uid:456
cn:bbb
TEST

my $begin="dn:aaa";
my $end="cn:bbb";
my $pattern="uid:456";
print "Matched at<<<$1>>> \n" if $test_data =~ m/$begin.*?($pattern).*?$end/s;

ms你的程序中也没有用到anchor啊
谢谢churchmice,我想匹配dn:aaa与dn:***之间,应该怎么写?谢谢


QUOTE:
原帖由 zhenggb 于 2008-5-3 21:32 发表
谢谢churchmice,我想匹配dn:aaa与dn:***之间,应该怎么写?谢谢

上文中
my $end = "ddd:..."
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
叁考看看


QUOTE:
原帖由 zhenggb 于 2008-5-3 21:32 发表
谢谢churchmice,我想匹配dn:aaa与dn:***之间,应该怎么写?谢谢

if /dn:aaa/../dn:*/
例子:

[Copy to clipboard] [ - ]
CODE:
while(<DATA>){
    if ( /dn:/.../dn:/ and /uid:123/ ){
        print "ok\n";
    }
}

__END__
dn:aaa
uid:123
cn:zh
dn:bbb
uid:456
cn:gz

如果只需要操作这一种情况的话,用 grep 也行:

[Copy to clipboard] [ - ]
CODE:
print "ok\n" if grep /dn:/.../dn:/ && /uid:123/, <DATA>;
__END__
dn:aaa
uid:123
cn:zh
dn:bbb
uid:456
cn:gz

非常感谢各位!!!谢谢^_^