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

Re: A way to untie -T vars?



On Wed, Jan 25, 2023 at 3:48 PM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
>
> The value being assigned to the variable is coming from $1=${(P)1} and
> ${(P)1} includes the specified justification, so the value assigned is
> always already the correct width.

Which means ${(P)#1} is the justification, no need to fork typeset for
that, and ...

> Is there any other way to reference
> the "real, unfilled" value of a parameter that has justification
> specified?

The only reliable way I can find is to first remove the justification:

% typeset -L5 FOO=123456789
% printf "<%s>\n" $FOO
<12345>
% typeset +L FOO
% printf "<%s>\n" $FOO
<123456789>

This can be done without otherwise changing the type or tied-ness of the scalar.

One more pass at it attached.
untie () {
  emulate -L zsh -o extendedglob -o errreturn
  while ((ARGC))
  do
    () {
      case -${(tP)1}- in
        (*-(readonly|special)-*) print -u2 -r "Can't untie ${(qqq)1}: ${(tP)1}"
          return 0 ;;
        (*-tied-*) set -- ${(s:-:tP)1} - $1 -g ;;
        (*) : "${1}: not a tied parameter"
          return 0 ;;
      esac
      while [[ $1 != - ]]
      do
        case $1 in
          (export) set -- "$@" -x ;;
          (tag) set -- "$@" -t ;;
          (unique) set -- "$@" -U ;;
          (upper) set -- "$@" -u ;;
          (lower) set -- "$@" -l ;;
          (hide) set -- "$@" -h ;;
          (hideval) set -- "$@" -H ;;
          (left) set -- "$@" -L${(P)#${@[$@[(i)-]+1]}} ;;
          (right_blanks) set -- "$@" -R${(P)#${@[$@[(i)-]+1]}} ;;
          (right_zeros) set -- "$@" -Z${(P)#${@[$@[(i)-]+1]}} ;;
        esac
        shift
      done
      shift
      case -${(tP)1}- in
        (*-array-*) set -- $# "$@" $1 "${(@P)1}"
          unset $2
          typeset -a ${argv[3,$1+1]} $2
          shift $1+1
          set -A "$@" ;;
        (*-scalar-*) typeset -g +L +R +Z $1
	  set -- "$@" $1=${(P)1}
          unset $1
          shift
          typeset "$@" ;;
        (*) print -u2 -r -- "${1}: impossible: ${(tP)1}"
          return 1 ;;
      esac
    } $1
    shift
  done
}


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