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

Re: more splitting



Thanks all.  Very nice explanation Dana.  I'm 90% there.

> No, actually, it can't have been designed differently.  Pipes (and all
file descriptors) are an operating system construct, they don't know
what's on either end, they just move bytes.
I mean that arrays might have been designed to carry a separator character between elements.  ASCII FF maybe.  So when piped, reconstructing an array would be easier.  Mind, this is the shallowest of speculations, there could be very good reasons why that's not done.  I'm not whining.    Anyway the point is that I now understand that information IS thrown away -- splitting information is lost, not by virtue of some magic characters being removed, but by virtue of C level storage information being lost.  The socks don't know what drawer they came from.  I get it.


%  var=("a b" c$'\n''d e f'' ''g h' ij)

% hex var

'a b'
$'c\nd e f g h'
ij

-----------------------------

000000  61  20  62
         a       b
000003
000000  63  0a  64  20  65  20  66  20  67  20  68
         c  \n   d       e       f       g       h
00000b
000000  69  6a
         i   j
000002

... The space after the 'b' is gone forever -- it has been taken as an instruction to split, NOT as a literal char.  The ' $'\n' ' construction has been taken as an instruction to add ASCII char 0a.  The space beween 'f' and 'g' is quoted therefore a printed character, not an instruction to split.  The next space is unquoted therefore an instruction to split, and it's gone.

% print -n $var
a b c
d e f g h ij#   # What's the hash for?

% hex var

'a b'
$'c\nd e f g h'
ij
...

... 'a b' is displayed quoted because of the space -- the ticks aren't 'real' .  Thus 'ij' needs no ticks.

 2 /aWorking/Zsh/Source/Wk 6 % var2=( $=var ); hex var2

a
b
c
d
e
f
g
h
ij

... as expected, except that the newline disappeared.

% var2=( ${(f)var} ); hex var2

'a b c'
'd e f g h ij'

-----------------------------

000000  61  20  62  20  63
         a       b       c
000005
000000  64  20  65  20  66  20  67  20  68  20  69  6a
         d       e       f       g       h       i   j
00000c

... love it.  Split on newline.  All spaces preserved. One thing tho: when $var is created, would not the splitting spaces vanish? But we see the space between 'b' and 'c' remains in var2.  Likewise the space between 'h' and 'i' -- how are they retained? Or are they put back for display?  

I'm not at the summit, but I'm at the South Col.


 % typeset -p var 
typeset -a var=( 'a b' $'c   \n  d e f     g h' ij ) # stretch out for comp.
% var=         ( "a b"    c$'\n''d e f'' ''g h' ij ) # stretched ...     


... so typeset output very close to original variable creation keystrokes.  Better! Running output of typeset -p to create a new array, it's identical to the original.  :-)  Typeset edits my input string while retaining the product exactly.  Love it.  IOW, typeset returns what I should have typed in the first place.  That explains the movement of the dollar too, which has always baffled me.  

95%

So a mad scientist could take the output from typeset -p, pipe that string and use it to create a new var downstream of the pipe!  




 



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