Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Patterns quoting in subscript (was: Re: PATCH: Assorted parameter stuff)

On Apr 17, 10:30pm, Andrej Borsenkow wrote:
} At least one thing has changed (but I consider behaviour broken in
} anyway):
} bor@itsrm2:~%> foo=(a '?' '\?')
} bor@itsrm2:~%> print -r $foo[(r)?]
} a
} bor@itsrm2:~%> print -r $foo[(r)\?]
} ?
} bor@itsrm2:~%> print -r $foo[(r)\\?]
} ?
} bor@itsrm2:~%> print -r $foo[(r)\\\?]
} ?

You just didn't try enough backslashes yet:

schaefer[507] print -r $foo[(r)\\\\\?]

The reason you need five is that [...] is parsed as if double quoted,
except that \] is magic instead of \".  Then the pattern inside it is
tokenized by (r) before being passed to patcompile().  So it goes like:

     parse        tokenize     pattern
    \\ \\ \?  -->  \\ \?   -->   \?

(In double quotes, \\ --> \ but \? --> \?.)

} Both are broken. Without patch you have at least some (albeit completely
} unclear) possibility to quote patterns in subscript - with patch even this
} one is gone.

Not true.  Without the patch you can't explain the rationale for quoting,
but with the patch it's predictable.  Similarly, without the patch this
fails utterly:

schaefer[508] x='\?'
schaefer[509] print -r $foo[(r)${(q)x}]

But with the patch it's possible to explain why it works:

     parse       tokenize     pattern
    ${(q)x}  -->  \\ \?   -->   \?
} Suggestion is something like
} $foo[()pattern] - is parsed just like a "normal" globbing pattern, taking
} in account any quoting. I.e. in $foo[(r)\*$bar] neither ``*'' nor contents
} of $bar is taken as pattern.

Unfortunately, this is a significant change in zsh semantics.  I don't
think we have the opportunity to do this any longer.  It may be too bad
that this wasn't originally the spec, but I think we're stuck with the
current interpretation of [(r)$bar].
} Special consideration is needed for double quotes. Because normally
} "$foo[(r)\?]" is parsed as *two* characters - ``\'' and ``?'', to allow
} quoting inside double-quotes extension of quoting rules is needed. I.e.
} ``\'' should be allowed to quote pattern metacharacters inside of
} subscript.

You'll note that with my patch the quoting inside and outside of double
quotes works exactly the same (except of course for the double-quote
character itself).  That is,

schaefer[513] print -r "$foo[(r)\\\\\?]"

Five backslashes, just as before; same result.

Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com

Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net   

Messages sorted by: Reverse Date, Date, Thread, Author