zsh-users
 help / color / mirror / code / Atom feed
* (0) not working ?
@ 2019-11-27 13:00 Marc Chantreux
  2019-11-27 13:54 ` Perry Smith
  2019-11-27 14:40 ` (0) not working ? Marc Chantreux
  0 siblings, 2 replies; 11+ messages in thread
From: Marc Chantreux @ 2019-11-27 13:00 UTC (permalink / raw)
  To: Zsh Users

hello people,

in zshexpn, i read about 0: "This is a shorthand for `ps:\0:'".
so i wrote:

    assigned_to=( qa c c++ )
    local -A user=(
        login marc
        roles ${(j:\0:)assigned_to}
    )
    print -l ${(s:\0:)user[roles]}
    print -l ${(@0)user[roles]}
    print -l ${(@0)user[roles]}

and i got

    qa
    c
    c++
    qa\0c\0c++
    qa\0c\0c++

is there something to setopt? did i miss something ?

regards,
marc

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) not working ?
  2019-11-27 13:00 (0) not working ? Marc Chantreux
@ 2019-11-27 13:54 ` Perry Smith
  2019-11-27 14:18   ` Marc Chantreux
  2019-11-27 14:40 ` (0) not working ? Marc Chantreux
  1 sibling, 1 reply; 11+ messages in thread
From: Perry Smith @ 2019-11-27 13:54 UTC (permalink / raw)
  To: Marc Chantreux; +Cc: Zsh Users

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

I’m very new here so take what I say with caution but why
did you put the backslash before the 0?

Also, this is going to null terminate each word and so what I
would do to verify this is either pipe it into xargs with -0 (if you
have that) or od -cx so you can verify that it is working like
you expect.

> On Nov 27, 2019, at 7:00 AM, Marc Chantreux <eiro@phear.org> wrote:
> 
> hello people,
> 
> in zshexpn, i read about 0: "This is a shorthand for `ps:\0:'".
> so i wrote:
> 
>    assigned_to=( qa c c++ )
>    local -A user=(
>        login marc
>        roles ${(j:\0:)assigned_to}
>    )
>    print -l ${(s:\0:)user[roles]}
>    print -l ${(@0)user[roles]}
>    print -l ${(@0)user[roles]}
> 
> and i got
> 
>    qa
>    c
>    c++
>    qacc++
>    qacc++
> 
> is there something to setopt? did i miss something ?
> 
> regards,
> marc


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2966 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) not working ?
  2019-11-27 13:54 ` Perry Smith
@ 2019-11-27 14:18   ` Marc Chantreux
  2019-11-27 14:56     ` Perry Smith
  0 siblings, 1 reply; 11+ messages in thread
From: Marc Chantreux @ 2019-11-27 14:18 UTC (permalink / raw)
  To: Perry Smith; +Cc: Marc Chantreux, Zsh Users

hello Perry,

> I’m very new here so take what I say with caution but why
> did you put the backslash before the 0?

if you use xxd:

    echo -n 0 $'\0'|xxd

you can see that 0 is the symbol 0x30 (48th of the ascii table)
when \0 is 00.

\0 is non-sense in a legit text stream so it can be used as
a separator instead of all those separators that can exist in
text ( "\n", ",", ":" " ", "\t").

see xargs -0, find -print0, ...

regards
marc



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) not working ?
  2019-11-27 13:00 (0) not working ? Marc Chantreux
  2019-11-27 13:54 ` Perry Smith
@ 2019-11-27 14:40 ` Marc Chantreux
  1 sibling, 0 replies; 11+ messages in thread
From: Marc Chantreux @ 2019-11-27 14:40 UTC (permalink / raw)
  To: Zsh Users

hello,

I spotted the error thanks to an example in a private message:

Ok. i got it reading your example: (pj:\0:) and (j:\0:) don't
behave the same even if it looks so when you print the string.

    print $user[roles]
    print -l ${(0)user[roles]}

gives

    qa=00c=00c++
    qa=00c=00c++

when serialized with ${(j:\0:)assigned_to} and

    qa=00c=00c++
    qa
    c
    c++

when serialized with ${(pj:\0:)assigned_to}.

thanks a lot and regards,
marc

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) not working ?
  2019-11-27 14:18   ` Marc Chantreux
@ 2019-11-27 14:56     ` Perry Smith
  2019-11-27 16:15       ` (0) works as a charm Marc Chantreux
  0 siblings, 1 reply; 11+ messages in thread
From: Perry Smith @ 2019-11-27 14:56 UTC (permalink / raw)
  To: Marc Chantreux; +Cc: Zsh Users


[-- Attachment #1.1: Type: text/plain, Size: 1304 bytes --]

It appears that you need the “p” flag for the join and probably for the split as well.

Also, @ says “In  double  quotes,  array  elements  are put into separate words.”
But you don’t have double quotes so the @ isn’t needed.

> % var1=( a b c d )   
> % var2=${(j:\0:)var1}
> % print $#var2
> 10

At this point var2 is a scaler with two characters ‘\’ and ‘0’ separating what were the words.

> % var3=${(pj:\0:)var1}
> % print $#var3
> 7

This is what you are expecting / needing

> % print -l ${(0)var3}
> a
> b
> c
> d

The print works

> % print -l ${(@0)var3}
> a
> b
> c
> d


The @ isn’t needed

(Again… I’m new here so please verify everything)

> On Nov 27, 2019, at 8:18 AM, Marc Chantreux <eiro@phear.org> wrote:
> 
> hello Perry,
> 
>> I’m very new here so take what I say with caution but why
>> did you put the backslash before the 0?
> 
> if you use xxd:
> 
>    echo -n 0 $'\0'|xxd
> 
> you can see that 0 is the symbol 0x30 (48th of the ascii table)
> when \0 is 00.
> 
> \0 is non-sense in a legit text stream so it can be used as
> a separator instead of all those separators that can exist in
> text ( "\n", ",", ":" " ", "\t").
> 
> see xargs -0, find -print0, ...
> 
> regards
> marc
> 
> 


[-- Attachment #1.2: Type: text/html, Size: 6719 bytes --]

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2966 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* (0) works as a charm
  2019-11-27 14:56     ` Perry Smith
@ 2019-11-27 16:15       ` Marc Chantreux
  2019-11-27 16:24         ` Roman Perepelitsa
  0 siblings, 1 reply; 11+ messages in thread
From: Marc Chantreux @ 2019-11-27 16:15 UTC (permalink / raw)
  To: Perry Smith; +Cc: Marc Chantreux, Zsh Users

hello

reconsidering the example i got privately:

print has this -r flags that makes things appears:

    foo=( this bar )
    a=${(pj:\0:)foo}
    b=${(j:\0:)foo}
    print -lr $a $b

gives

    this\0bar
    this\0bar

that's why (p) is mandatory while joining:
* if p is present while joining, it must be present while splitting
* -1s/present/absent/g
* as the manual says: 0 means ps:\0:

regards
marc

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) works as a charm
  2019-11-27 16:15       ` (0) works as a charm Marc Chantreux
@ 2019-11-27 16:24         ` Roman Perepelitsa
  2019-11-27 18:14           ` Perry Smith
  0 siblings, 1 reply; 11+ messages in thread
From: Roman Perepelitsa @ 2019-11-27 16:24 UTC (permalink / raw)
  To: Marc Chantreux; +Cc: Perry Smith, Zsh Users

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

> * if p is present while joining, it must be present while splitting
> * -1s/present/absent/g
> * as the manual says: 0 means ps:\0:


p simply converts \0 to ascii 0. It's the same as '\0' vs $'\0'.

Roman.

>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (0) works as a charm
  2019-11-27 16:24         ` Roman Perepelitsa
@ 2019-11-27 18:14           ` Perry Smith
  2019-11-27 19:33             ` (about quoting) " Marc Chantreux
  0 siblings, 1 reply; 11+ messages in thread
From: Perry Smith @ 2019-11-27 18:14 UTC (permalink / raw)
  To: Zsh Users

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

On Nov 27, 2019, at 10:24 AM, Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote:
> 
>> * if p is present while joining, it must be present while splitting
>> * -1s/present/absent/g
>> * as the manual says: 0 means ps:\0:
> 
> p simply converts \0 to ascii 0. It's the same as '\0' vs $'\0’.

I’m still not clear…

> QUOTING
>        A character may be quoted (that is, made to stand for itself) by preceding it with a `\'.  `\'  followed  by  a
>        newline is ignored.
> 
>        A  string enclosed between `$'' and `'' is processed the same way as the string arguments of the print builtin,
>        and the resulting string is considered to be entirely quoted.  A literal `'' character can be included  in  the
>        string by using the `\'' escape.
> 
>        All  characters enclosed between a pair of single quotes ('') that is not preceded by a `$' are quoted.

Are you saying that ‘\0’ is a quoted null character while $’\0’
is a quoted string with one character which is a null and somehow
zsh keeps quoted characters different from quoted strings?


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2966 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* (about quoting) Re: (0) works as a charm
  2019-11-27 18:14           ` Perry Smith
@ 2019-11-27 19:33             ` Marc Chantreux
  2019-11-27 20:21               ` Perry Smith
  0 siblings, 1 reply; 11+ messages in thread
From: Marc Chantreux @ 2019-11-27 19:33 UTC (permalink / raw)
  To: Perry Smith; +Cc: Zsh Users

hello,

> Are you saying that ‘\0’ is a quoted null character while $’\0’
> is a quoted string with one character which is a null and somehow
> zsh keeps quoted characters different from quoted strings?

the opposite: $'' is yet another quoting style in zsh to know what
will be expanded

       | ""    $''  ''  none
    ---+-----------------
    $  | yes   no   no  yes
    \  | yes   yes  no  no[1]
    
    [1] remove the '\' symbol

    print -r "\n" $'\n' '\n' \n | xxd

first i was confused because by default, print interpolate \
before printing as long as you don't use -r.

so

    x='\0'
    print $x
    x=$'\0'
    print $x

looks the same

regards
marc

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (about quoting) Re: (0) works as a charm
  2019-11-27 19:33             ` (about quoting) " Marc Chantreux
@ 2019-11-27 20:21               ` Perry Smith
  2019-11-28 10:55                 ` Marc Chantreux
  0 siblings, 1 reply; 11+ messages in thread
From: Perry Smith @ 2019-11-27 20:21 UTC (permalink / raw)
  To: Zsh Users

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



> On Nov 27, 2019, at 1:33 PM, Marc Chantreux <eiro@phear.org> wrote:
> 
> hello,
> 
>> Are you saying that ‘\0’ is a quoted null character while $’\0’
>> is a quoted string with one character which is a null and somehow
>> zsh keeps quoted characters different from quoted strings?
> 
> the opposite: $'' is yet another quoting style in zsh to know what
> will be expanded
> 
>       | ""    $''  ''  none
>    ---+-----------------
>    $  | yes   no   no  yes
>    \  | yes   yes  no  no[1]
> 
>    [1] remove the '\' symbol
> 
>    print -r "\n" $'\n' '\n' \n | xxd
> 
> first i was confused because by default, print interpolate \
> before printing as long as you don't use -r.
> 
> so
> 
>    x='\0'
>    print $x
>    x=$'\0'
>    print $x
> 
> looks the same

AH!!  So… testing with “print” (without -r) has pitfalls…

I had no idea print was interpreting things on output…

thank you all for your patience


[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 2966 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: (about quoting) Re: (0) works as a charm
  2019-11-27 20:21               ` Perry Smith
@ 2019-11-28 10:55                 ` Marc Chantreux
  0 siblings, 0 replies; 11+ messages in thread
From: Marc Chantreux @ 2019-11-28 10:55 UTC (permalink / raw)
  To: Perry Smith; +Cc: Zsh Users

> > so
> >    x='\0'
> >    print $x
> >    x=$'\0'
> >    print $x
> > looks the same
> AH!!  So… testing with “print” (without -r) has pitfalls…

not really pitfalls as the default behaviour probably works
the way we expect most of the time.

> I had no idea print was interpreting things on output…

not "on ouput" but "before releasing on the ouput" but yes: i missed
that point too.

regards
marc

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2019-11-28 10:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-27 13:00 (0) not working ? Marc Chantreux
2019-11-27 13:54 ` Perry Smith
2019-11-27 14:18   ` Marc Chantreux
2019-11-27 14:56     ` Perry Smith
2019-11-27 16:15       ` (0) works as a charm Marc Chantreux
2019-11-27 16:24         ` Roman Perepelitsa
2019-11-27 18:14           ` Perry Smith
2019-11-27 19:33             ` (about quoting) " Marc Chantreux
2019-11-27 20:21               ` Perry Smith
2019-11-28 10:55                 ` Marc Chantreux
2019-11-27 14:40 ` (0) not working ? Marc Chantreux

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).