Как манипулировать массивами, используя косвенные ссылки в ksh? - PullRequest
1 голос
/ 16 августа 2011

Я хочу сделать скрипт вида:

#!/usr/bin/ksh93    
typeset -A foo

function fillItUP {
    typeset -A newarr
    newarr["this"]="bar"
    newarr["another"]="tut"

    inputarrayname=$1

    nameref $inputarrayname=newarr
}

С выходом вида:

fillItUP "foo"
echo ${foo["this"]}
bar

Полагаю, это довольно очевидно, но я подумал о том, чтобы использовать двойную косвенную ссылку для манипулирования массивом внутри функции, а затем использовать его снаружи. Не работает : (

Кто-нибудь знает способ достижения этого?

1 Ответ

1 голос
/ 24 августа 2011

Спасибо за объяснение.Я понимаю, что вы пытаетесь осуществить.

Теперь вот рабочий код

#!/usr/bin/ksh93
typeset -A foo
foo["this"]="old bar"
foo["another"]="old tut"

function fillItUP {
    nameref newarr=$1
    newarr["this"]="bar"
    newarr["another"]="tut"
    ## nameref newarr=$1


}
fillItUP foo
echo ${foo["this"]}

Вся идея nameref typeset -n состоит в том, чтобы передать переменную из одной области видимости вдругой.В своем примере кода вы сначала выделяли локальный массив для своей функции fillItUP (ПРИМЕЧАНИЕ: почему локальный ?? Прочтите это в ... typeset и scope ), а затем пытались указать локальный массив наFoo.Если вы хотите изменить foo .. вам нужно сделать так, чтобы локальная переменная указывала на foo, а затем изменить его.

Если вы раскомментируете 'commed nameref' и прокомментируете 'uncommented nameref', вы увидите, что значениеФу по-прежнему "старый бар".Если вы выполните код, который я добавил, как есть, вы увидите, что значение, если foo [this] = bar, а не «old bar»

Надеюсь, это помогло.

ПРИМЕЧАНИЕ:Вы можете закомментировать исходное «старое» содержимое foo и попробовать тоже:)

...