http://qs321.pair.com?node_id=522467


in reply to Making an LDAP filter more readable

This seems to get closed to the required output:

Updated: Corrected fencepost-ish error.

Update2: Added a second pass to condense it a bit.

#! perl -slw use strict; ( my $input = do{ local $/; <DATA> } ) =~ tr[\n][]d; my $tab = 0; $input =~ s[([()])]{ $tab-- if $1 eq ')'; my $modified = "\n" . ( " " x $tab ) . $1; $tab++ if $1 eq '('; $modified; }ge; $input =~ s[\n\s+\)][)]g; print $input; __DATA__ (&(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=use +r)(!(homeM DB=*))(!(msExchHomeServerName=*)))(&(objectCategory=person)(objectClas +s=user)(| (homeMDB=*)(msExchHomeServerName=*)))(&(objectCategory=person)(objectC +lass=cont act))(objectCategory=group)(objectCategory=publicFolder)(objectCategor +y=msExchD ynamicDistributionList) )))(objectCategory=contact)(proxyAddresses=smt +p:*exampl e.com)))

Yields:

P:\test>junk1 (& (& (& (& (mailnickname=*) (| (& (objectCategory=person) (objectClass=user) (! (homeMDB=*)) (! (msExchHomeServerName=*))) (& (objectCategory=person) (objectClass=user) (| (homeMDB=*) (msExchHomeServerName=*))) (& (objectCategory=person) (objectClass=contact)) (objectCategory=group) (objectCategory=publicFolder) (objectCategory=msExchDynamicDistributionList) ))) (objectCategory=contact) (proxyAddresses=smtp:*example.com)) )

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Making an LDAP filter more readable
by bronto (Priest) on Jan 11, 2006 at 15:48 UTC

    Very interesting! I have just some difficulties in reading that s/// operator. Could you please explain?

    Thanks for posting!

    Ciao!
    --bronto


    In theory, there is no difference between theory and practice. In practice, there is.

      Sure.

      my $tab = 0; ## Number of 'tabs' to insert starts at zero $input =~ s[ ( ## Capture to $1 [()] ## All open or close parens ) ]{ ## /e-xecute turns the second half into a code block. ## Decrement teh tab count if this is a close paren $tab-- if $1 eq ')'; ## Insert a newline + $tab tabs before the paren (open or close) my $modified = "\n" . ( " " x $tab ) . $1; ## Increment the tab count if this is an open paren $tab++ if $1 eq '('; ## And 'return' the modified text for substitution $modified; }xge; ## Late addition: ## Second pass strips out any 'lone' close parens ## to compact the results a little. $input =~ s[\n\s+\)][)]g;

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.