Qual é a maneira mais correta de passar uma matriz para uma função?

8

Considere que eu tenho uma matriz muito grande $large_list , existe uma maneira de escrever uma função que levará a matriz como um argumento? Por exemplo:

echo_idx_array () {
    arr="$1"
    idx="$2"

    echo "${arr[$idx]}"
}

Qual é a estratégia usual para fazer algo assim? Eu tentei dar a variável $large_list mas estava vazia.

Estou disposto a modificar a função para adaptá-la a qualquer alteração na lista de argumentos.

Para o registro, estou usando o ksh88 e estou procurando respostas tão portáteis quanto possível.

EDIT : Até agora, o melhor que consegui criar é percorrer o array e enviar cada elemento como um argumento para a função. Isso parece incrivelmente feio e propenso a erros, sem mencionar que está prestes a atingir algum limite rapidamente. Aqui está o que eu fiz:

foo () {
    echo $*
}

cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
    cmd="$cmd ${large_list[$i]}"
    ((i=i+1))
done

eval $cmd

Não há algo melhor para fazer?

    
por rahmu 22.06.2012 / 11:38

3 respostas

10

Para passar os elementos da matriz como argumentos para a função, use a sintaxe ksh para expandir os elementos da matriz como uma lista.

work_on_array "${myarray[@]}"

O sufixo [@] torna isso uma expansão de matriz. As aspas duplas protegem cada elemento contra expansão adicional (divisão e globbing). O resultado da expansão não é, em geral, uma palavra como normalmente é com aspas duplas, mas tantas palavras quanto elementos no array.

O elemento N th da matriz é então ${N} . Para acessá-lo, você precisa usar eval ; consulte Use uma referência de variável "dentro" de outra variável

    
por 23.06.2012 / 02:57
4

Existe uma maneira no bash 4.3+, que provavelmente vem do ksh:

echo_idx_array () # array index
{
    local -n array=$1     # add nameref attribute
    local idx=$2
    echo "${array[idx]}"
}

$ names=(one two three four)
$ echo_idx_array names 2
three
$ days=([monday]=eggs [tuesday]=bread [sunday]=jam)    # associative array
$ echo_idx_array days sunday
jam

Veja também declare -n .

    
por 18.10.2014 / 19:25
1

Depende da Korn Shell ... versões recentes da AT & T ksh93 e mksh suportam isso:

function echo_idx_array {
    nameref arr=$1
    idx=$2

    echo "${arr[idx]}"
}

set -A test -- a b c
echo_idx_array test 1

No meu shell atual, isso gera "b".

    
por 27.02.2014 / 23:08

Tags