Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Patterns quoting in subscript (was: Re: PATCH: Assorted parameter stuff)
- X-seq: zsh-workers 14007
- From: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxxxxxxxxx>
- To: Andrej Borsenkow <Andrej.Borsenkow@xxxxxxxxxxxxxx>, <zsh-workers@xxxxxxxxxx>
- Subject: Re: Patterns quoting in subscript (was: Re: PATCH: Assorted parameter stuff)
- Date: Wed, 18 Apr 2001 07:38:53 +0000
- In-reply-to: <Pine.SV4.4.33.0104172214250.9148-100000@xxxxxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <Pine.SV4.4.33.0104172214250.9148-100000@xxxxxxxxxxxxxxxxxxxxx>
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