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