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

Re: priority problem of ":|" and ":*"



On Wed, Dec 26, 2012 at 01:10:19AM -0800, Bart Schaefer wrote:
> Hmm.
> 
> % a1=(a b c); print "${#a1}" :"${a1}":
> 3 :a b c:
> 
> Plainly if length were applied after double-quoted joining, the above
> should print 5 rather than 3.  As I'm pretty sure this hasn't changed
> *ever*, it must be that the documentation is wrong, not that :| has the
> wrong priority.
> 
> And in fact poring through the code it appears that rule 5 double-quoted
> joining is explicitly SKIPPED when the length is requested:
> 
>     if (isarr) {
>         if (nojoin)
>             isarr = -1;
>         if (qt && !getlen && isarr > 0) {
>             val = sepjoin(aval, sep, 1);
>             isarr = 0;
>         }
>     }
> 
> "qt" there means double-quoted, but "getlen" means the "#" was seen.  So
> when evaluating length, we do not remove arrayness.
> 
But I think ":|" doesn't skip the double-quoted, so the "#" would get the
length of the result of ":|", because "#"'s priority is lower than
":|"'s. Or when running in double-quoted, "#" will has a higher priority
?

    % a1=(a b c);a2=('a b c');print ${#a1:|a2}
    3
    % a1=(a b c);a2=('a b c');print "${a1:|a2}"

    % a1=(a b c);a2=('a b c');print "${#a1:|a2}"
    3

Looks like #'s priority will be higher than :| in the double-quoted. 




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