Возня с функциями и ассоциативными массивами в ksh93

Это мой простой массив:

typeset -A foo

foo["first"]="first Value"
foo["second"]="second Value"

И я хочу сделать функцию, которая бы брала этот массив, что-то делала и возвращала обратно в скрипт. например

function changeThat {
    eval tmp=\$$1
    tmp["$2"]=$3
    return $tmp
}

Я мог бы пойти по сценарию и сделать что-то вроде:

foo=changeThat foo "first" "a new first value"

И получить красивый результат, как

echo ${foo["first"]}
a new first value

Теперь это не работает... Ну, я знаю, что синтаксис, возможно, не совсем правильный. Но я совсем запутался, разбираясь в нюансах evals и скейпа echo (не сказать, что ненавижу его всей душой). Кроме того, я ссылаюсь на bash и не в первый раз пропускаю какой-то трюк, когда дело доходит до ksh. Например, я до сих пор был в ksh88, в котором даже нет ассоциативных массивов, хотя большинство людей говорят, что должны. Оказывается, моя коробка AIX не согласуется. -_-

Спасибо!


person filippo    schedule 16.08.2011    source источник


Ответы (1)


Вы можете определить свою функцию следующим образом:

function changeThat {
  typeset -n ref="$1"
  typeset key="$2"
  typeset value="$3"

  ref["$key"]="$value"
}

typeset -n ref определяет переменную ref как ссылку на переменную, указанную ее значением.

Когда вы делаете этот вызов функции:

changeThat foo this "mow the lawn"

Переменная ref в функции changeThat ссылается на переменную foo. Использование ref теперь похоже на использование foo. После вызова changeThat

    print ${foo["this"]}

теперь будет выводить «косить газон».

person Mark Wenzel    schedule 14.04.2012