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

Re: ksX-Mailer: MH-E 8.6; GNU Mailutils 3.2; GNU Emacs 24.5.1



On 2017-09-09 at 17:00 +1700, jdh wrote:
> I wanted to use the array flage (i) to get an index into a charagcter array (a string), but am getting incorrect results.  Here is an example code snippet which shows the  oddity.
> 
> #
> #  below define a table (string) with 4 characters.
> chrtab="#()*"
> for (( ndx=1;  ndx<=$#chrtab ; ndx++ ))
>     do echo "Character is $chrtab[ndx], but retrieved index is $chrtab[(i)$chrtab[ndx]]"
>     done
> 
> I expect the result to be 1, 2, 3, 4
>                  but get  5, 5, 5, 1
> 
> Is this a a feature or a bug?

Both, I think?

The `i` is documented to return one past the length of the item, so `5`
means "not found".  You can use `I` and see `0` instead.

It's because those are pattern characters, thus the `*` matching the
first item and returning `1`.  So I'd _expect_ that using the `e` flag
too would resolve it, but it only fixes two of those.

    for (( ndx=1;  ndx<=$#chrtab ; ndx++ )); do
      echo "Character is $chrtab[ndx], but retrieved index is $chrtab[(ie)$chrtab[ndx]]"
    done

Result: 5, 5, 3, 4

What works instead is to backslash-escape the metacharacters:

    for (( ndx=1;  ndx<=$#chrtab ; ndx++ )); do
      echo "Character is $chrtab[ndx], but retrieved index is $chrtab[(i)${(q)chrtab[ndx]}]"
    done

Result: 1, 2, 3, 4

I'm not off-hand seeing why `(ie)` indexing wouldn't handle the `#` and
`(` entries though, which is why I think perhaps a bug.  But I'm
probably wrong and I too would be interested in learning why this is
expected behavior.  :)

-Phil



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