Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: triviality regarding $# counts
On 2024-04-11 21:55, Lawrence Velázquez
wrote:
If eval really is necessary (to be frank, I don't trust your judgment
on this), show us examples that require it, instead of the misleading
Rube Goldberg machines you've been offering.
I don't trust it neither, and I taught Rube everything he knows.
Seriously, you won't sympathize, but the tinkerer's approach was the
only one available to me at least until I had enough ad hoc code
built up that sorta works to begin to start to try to understand it
formally. And my efforts to find patterns of behavior -- as you
know better than anyone -- lead me to false conclusions all the
time. The manual is useless as pedagogy. If there was 'zsh school'
I'd enroll and learn my shell ABC's properly from the ground up.
But there isn't. So I hack away. But please understand I *hate*
being me. I like competence :(
The count is correct by accident. Your unquoted command substitution
drops the two empty lines but splits the two lines you say should not
be split.
Right, I'm aware of that possibility at least in theory. Word
splitting lurks.
% orig='abc
quote>
quote> def ghi
quote> jkl mno
quote>
quote> pqr'
% arr=($(print -r -- $orig))
% typeset -p arr
typeset -a arr=( abc def ghi jkl mno pqr )
It will take me a long time to understand that.
% cat foo.zsh
orig='abc
def ghi
jkl mno
pqr'
# The sensible way to split on LFs.
#arr=("${(@f)orig}")
# A very silly way to split on LFs. Use double quotes to
# prevent the result of $(...) from being split and to retain
# empty words in the result of ${(@)...}.
arr=("${(@f)$(print -r -- $orig)}")
typeset -p arr
print -r -- $#arr
# Use double-quoted $arr[@] to retain empty elements. Use
# "print -C1" to avoid printing an empty line if "arr" is empty.
print -rC1 -- "$arr[@]"
% zsh ./foo.zsh
typeset -a arr=( abc '' 'def ghi' 'jkl mno' '' pqr )
6
abc
def ghi
jkl mno
pqr
%
I think I can chew on that, backatcha later.
You both populate and print your array incorrectly. For the umpteenth
time, you should use "typeset -p" to inspect your variables' values.
I keep typeset -p close at all times now. But there are times when
I'm still baffled. Like an alchemist. Sheesh, just yesterday I was
attempting to transform this:
typeset -g var="
abc
def ghi
jkl mno
pqr
"
... into an array that retained the same 'shape' -- that prints
verbatim -- and typeset -p showed newlines being transubstantiated
into dollar signs! God knows how.
For now, what I'm wishing for is a nice, focused essay: "How to use
'$#' to count whatever it is you want to count -- characters, words,
lines, paragraphs (at one point my count was '3' which I'd
approximate to being a paragraph) ... and all with or without spaces
and/or empty lines. " Should run about ten pages but it would be
everything there is to know about '$#'.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author