zsh-users
 help / color / mirror / code / Atom feed
From: Kurtis Rader <krader@skepticism.us>
To: Ray Andrews <rayandrews@eastlink.ca>
Cc: Zsh Users <zsh-users@zsh.org>
Subject: Re: syntactic question
Date: Fri, 21 Nov 2014 13:42:39 -0800	[thread overview]
Message-ID: <CABx2=D8cNJJnbJtOavi_0tXf7bOssMLHaRfe8MBoaHHpXB3r9A@mail.gmail.com> (raw)
In-Reply-To: <546F9F41.8040608@eastlink.ca>

[-- Attachment #1: Type: text/plain, Size: 3300 bytes --]

Is this understandable for a mere mortal? Yes, but it requires a good grasp
for the rules of how a statement is parsed into tokens. Specifically, how
quotes are handled. It's a pretty good example for why any non-trivial
substitutions (i.e., those involving quotes) is probably better done in a
language which doesn't have such an intimate relationship between between
parsing and evaluating a statement.

What's going on might be a little clearer if you use "print -r" rather than
"echo":

#!/bin/zsh
test="one\ttwo"

print -r  1 ${test//'\'/\\}
print -r "2 ${test//'\'/\\}"
print -r  3 ${test//\\/\\}
print -r "4 ${test//\\/\\}"
print -r  5 ${test//'\'/'\'}
print -r "6 ${test//'\'/'\'}"
print -r "7 ${test//'\'/'\\'}"
print -r "8 ${test//'\'/'\\\\'}"
print -r "9 ${test//'\\'/'\\'}"

print

print -r  1 ${test//'\'/X}
print -r "2 ${test//'\'/X}"
print -r  3 ${test//\\/X}
print -r "4 ${test//\\/X}"
print -r  5 ${test//'\'/'X'}
print -r "6 ${test//'\'/'X'}"
print -r "7 ${test//'\'/'X'}"
print -r "8 ${test//'\'/'X'}"
print -r "9 ${test//'\\'/'X'}"


On Fri, Nov 21, 2014 at 12:23 PM, Ray Andrews <rayandrews@eastlink.ca>
wrote:

> All,
>
> Running this script:
>
>    test="one\ttwo"
>
>    echo  1 ${test//'\'/\\}
>    echo "2 ${test//'\'/\\}"
>    echo  3 ${test//\\/\\}
>    echo "4 ${test//\\/\\}"
>    echo  5 ${test//'\'/'\'}
>    echo "6 ${test//'\'/'\'}"
>    echo "7 ${test//'\'/'\\'}"
>    echo "8 ${test//'\'/'\\\\'}"
>    echo "9 ${test//'\\'/'\\'}"
>
> ... I get this output:
>
>    1 one    two
>    2 one    two
>    3 one    two
>    4 one    two
>    5 one    two
>    6 one'\'ttwo
>    7 one'\'ttwo
>    8 one'\'ttwo
>    9 one    two
>
>
> Lines one thru five are no puzzle, they're just different ways
> of saying the same thing: we're replacing the backslash character
> with itself (as an exercise). But at line six the rules change.
> Now the outer quotes seem to be meddling inside the substitution,
> and the single-quoted backslash output becomes literal: '\'
> but the input syntax is unchanged.
>
> I've always thought that all parsing systems work from the 'inside out'
> which is to say that (as with math) you 'do' the deepest parenthesis
> first, and then work outward. In the same spirit, I'm expecting
> the substitution to do what it does following it's own rules and
> nevermind any quotations or anything else 'further out'. But if
> zsh does permit the outer quotes to change what happens inside
> the substitution, then why is it not equal in it's effect on the
> input string?
>
> I'm puzzled by the fact that lines six, seven and eight produce the
> same output, and there again there is no symmetry between the input
> and the output strings, since, in line nine, doubling the input
> backslash doesn't work, whereas it does work in the output string (seven).
> It seems 'obvious' to me that all of the above, except seven and eight,
> are saying 'replace a backslash with itself'. Six should work the same
> as one thru five, and if seven works, then so should nine. Why line
> eight works, I'm not sure I even want to know ;-)
>
> In practice there's no huge problem tho, since the 'all backslash'
> forms always work the same way. Is this understandable for a mere
> mortal?
>
>


-- 
Kurtis Rader
Caretaker of the exceptional canines Junior and Hank

  parent reply	other threads:[~2014-11-21 21:42 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-21 20:23 Ray Andrews
2014-11-21 21:29 ` Bart Schaefer
2014-11-21 23:46   ` Ray Andrews
2014-11-22  0:00     ` Bart Schaefer
2014-11-22  1:40       ` Ray Andrews
2014-11-21 21:42 ` Kurtis Rader [this message]
2014-11-21 23:45   ` Bart Schaefer
2014-11-22  4:39     ` Ray Andrews

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CABx2=D8cNJJnbJtOavi_0tXf7bOssMLHaRfe8MBoaHHpXB3r9A@mail.gmail.com' \
    --to=krader@skepticism.us \
    --cc=rayandrews@eastlink.ca \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).