Zsh Mailing List Archive
Messages sorted by:
Re: Patterns quoting in subscript (was: Re: PATCH: Assorted parameter stuff)
- X-seq: zsh-workers 14014
- From: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxxxxxxxxx>
- To: <zsh-workers@xxxxxxxxxx>
- Subject: Re: Patterns quoting in subscript (was: Re: PATCH: Assorted parameter stuff)
- Date: Wed, 18 Apr 2001 17:26:22 +0000
- In-reply-to: <Pine.SV4.4.33.0104181227270.29688-100000@xxxxxxxxxxxxxxxxxxxxx>
- In-reply-to: <Pine.SV4.4.33.0104181243140.2545-100000@xxxxxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <Pine.SV4.4.33.0104181227270.29688-100000@xxxxxxxxxxxxxxxxxxxxx> <Pine.SV4.4.33.0104181243140.2545-100000@xxxxxxxxxxxxxxxxxxxxx>
On Apr 18, 12:34pm, Andrej Borsenkow wrote:
} Subject: Re: Patterns quoting in subscript (was: Re: PATCH: Assorted param
} On Wed, 18 Apr 2001, Bart Schaefer wrote:
} > schaefer 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 \? --> \?.)
} O.K., any chance to explain the above in Zsh doc?
Yes, I just don't want to spend time writing doc if this change is going
to cause some other problem and therefore not be included.
} Just to make sure that I understand:
} - "as if in double quotes" means, that I cannot use "..." or '...' quoting
} inside of subscript, only back-slash is possible?
It's exactly like quoting for $[...] math expressions, except that (as
of 14008) spaces are not permitted. Which for a traditional numeric
subscript makes sense, as it *is* a math expression.
} - the rule for ``\\'' and ``\$'' still aplies? But ``\"'' is parsed as
} *two* characters?
On Apr 18, 12:45pm, Andrej Borsenkow wrote:
} O.K., but why when I add additional backslashes I still get a match?:
} bor@itsrm2:~%> print -r $foo[(r)\\\\\\\\\?]
} ?? It seems to happen for any number of extra backslashes.
Well, sigh, patcompile() also apparently does a level of backslash-removal,
so i've forgotten one step in the explanation above. It's something like:
parse tokenize pattern match
\\ \\ \? --> \\ \? --> \? --> \?
\\ \\ \\ \\ \? --> \\ \\ \? --> \\ ? --> \?
Then you also have to remember that `?' as a metacharacter matches any
character, so one extra backslash will result in a pattern that matches
by wildcard rather than by a literal question-mark. So if you want to
match 4 backslashes, you need 16 backslashes; but if you want to match
4 backslashes followed by a literal question mark, you need a whopping
34 backslashes, because you have to double all 16 of those backslashes
and then add two more to quote the `?' itself.
Clearly this is silly; it results because of the extra call to parsestr()
that happens when the `needtok' loop in getarg() detects an ispecial()
(the `?' in this example). I'll see if that can't be made to behave a
bit more intelligibly.
Bart Schaefer Brass Lantern Enterprises
Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net
Messages sorted by: