shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RES: [shell-script] "Bizarrices" com Arrays.


From: Rodolfo Villanova
Subject: RES: [shell-script] "Bizarrices" com Arrays.
Date: Thu, 30 Dec 2004 17:03:42 -0300

Amigos,

A propósito do tema, em abril do ano passado andei "viajando" justamente
sobre esse assunto, quando tão bem me contestou o grande (e "verde") Aurélio
Jargas.

Espero que essa sequencia de mensagens contribua de alguma forma para
enriquecer e despertar a busca do conhecimento aos novos experimentadores de
criação de shell-scripts.

Forte abraço a todos,
Rodolfo Villanova

8<-------------------------------------------------------->8
> -----Mensagem original-----
> De: Rodolfo Villanova
> [mailto:address@hidden]
> Enviada em: terça-feira, 22 de abril de 2003 18:11
> Para: address@hidden
> Assunto: RES: [shell-script] shell ou nao shell, eis a questao
>
>
> É isso aí, Aurélio!
>
> Nada como a experimentação para vislumbrar novos horizontes.
> Concordo "ipsis literis" em relação aos conceitos sobre matrizes
> que expuseste aqui na lista.
> Mas como em computação esses conceitos nem sempre se aplicam de
> forma ortodoxa, resolvi testar alguns limites.
>
> Andei fuçando de novo no que tu NÃO chamas de matriz e no que eu
> chamaria princípio de matriz e cheguei a algumas conclusões:
>
> 1. Pode-se dimensionar isso que tu não chamas mas eu chamaria de
> matriz em 11x14 (linhas: [0-10]; colunas: [0-23] - o que,
> convenhamos, é bastante limitado e acompanha o limite de vetor no
> shell-script). O problema central reside em armazenar e recuperar
> nessa "coisa" que eu chamaria de matriz os dados que eu quiser.
>
> 2. Como essa "joça" de matriz não se comporta como uma matriz
> normal se comportaria em qualquer outra linguagem computacional
> (M[x;y]), então só posso concluir que só é possível acessá-la
> decentemente na forma vetorial V[264] - forma, aliás, como os
> computadores processam matrizes).
>
> 3. O "cheese" da "questã", nesse caso, é a forma matricial como
> indexo os valores contidos nesse vetor, onde alguns valores se
> sobrepõe por não existirem índexadores específicos para esse fim.
>
> 4. Finalizando, apesar de o shell-script não oferecer recursos de
> tratamento matricial, provei (nem que seja para meu próprio ego!)
> que esse tipo de tratamento pode ser simulado sobre a dimensão de
> vetor de uma forma limitada; não existir a forma normalmente
> prevista de indexação matricial, mas se tentarmos simulá-la e
> tentarmos utilizá-la de forma ampla, alguns valores armazenados
> nesse vetor acabam se sobrepondo em determinados intervalos,
> inutilizando alguns dados alí armazenados.
>
> 5. Chega desse assunto que eu já enjoei!
>
> ------------------
> for i in 1 2 3 4 5
> do
>   echo "ABRAÇO \c"
> done
> ------------------
>
> Rodolfo Villanova
>
>
> -----Mensagem original-----
> De: aurelio [mailto:address@hidden]
> Enviada em: terça-feira, 22 de abril de 2003 16:43
> Para: address@hidden
> Assunto: Re: [shell-script] shell ou nao shell, eis a questao
>
>
> oi rodolfo,
>
>  --- Rodolfo Villanova escreveu:
> > Realmente há a limitação de só ser possível incluir até 10x10 no que
> > normalmente eu chamaria de "matriz".
> >
> > Se o que segue abaixo não reproduz o princípio de matriz, então nunca
> > entendi ou já esqueci qual o conceito de matrizes (o que vem a
> > reforçar um antigo ódio à matemática, mesmo! %P)
>
> calma, seguir segue :), só que com a limitação do 10x10.
> se o bash suportasse matrizes "de verdade", não haveria este
> limite, pois ele deixaria você colocar um array dentro de
> outro array.
>
>
> > Meu script de teste:
>
> seu script funciona, mas se o bash suportasse matrizes
> de verdade, na atribuição dos valores, ao invés do
>
> >         P[$i$j]=$k
>
> você faria
>
>             P[$i][$j]=$k
>
> e na hora de pegar o resultado:
>
> >         echo "${P[$i$j]} \t\c"
>
> ficaria:
>
>           echo "${P[$i][$j]} \t\c"
>
>
> a grande diferença de se ter os dois [] separados é que
> você pode por qualquer número dentro de cada um deles,
> então se você quiser ter uma matriz de 99x99, bastaria
> defini-la e usar o ${matriz[99][99]} para pegar o valor.
>
> mas isso não rola no bash, pois não dá pra colocar um array
> dentro uma pasição qualquer de um array já existente.
>
> aliás, você de repente pode fazer um
>
>    matriz[9999]='bla'
>
> e depois se virar nos 'for' da vida, mas fica um troço meio,
> digamos, porco :)
>
> só pra exemplificar, um trechinho de código em python
> (mas poderia ser qualquer outra linguagem) que demonstra
> como criar e obter valores de uma matriz usando os colchetes:
>
> >>> matriz = [ [], [], [] ]
> >>> matriz[0] = [0,1,2,3,4,5]
> >>> matriz[1] = [6,7,8]
> >>> matriz[2] = [9,10,11,12]
> >>> matriz[1]
> [6, 7, 8]
> >>> matriz[1][1]
> 7
>
> em shell:
>
> # matriz[0]=(0,1,2,3,4,5)
> bash: matriz[0]: cannot assign list to array member
>
>
> isso é exatamente o que o shell não suporta, você poder
> colocar um array dentro de um array, formando uma matriz
> de arrays, com 'linhas' e 'colunas'.
>
> ficou claro ou baguncei mais ainda?  :)
>
>
> > -----Mensagem original-----
> > De: aurelio [mailto:address@hidden]
> >
> > > > for i in 1 2 3
> > > > do
> > > >         for j in 1 2 3
> > > >         do
> > > >                 [ "${P[$i$j]}" = X ] && LX[i]=$((${LX[$i]}+1))
> > > >                 [ "${P[$i$j]}" = O ] && LO[i]=$((${LO[$i]}+1))
> > > >                 [ "${P[$j$i]}" = X ] && CX[i]=$((${CX[$i]}+1))
> > > >                 [ "${P[$j$i]}" = O ] && CO[i]=$((${CO[$i]}+1))
> > > >         done
> > > > done
> >
> > ok, isso funciona, mas não deixa de ser um array
> > unidimensional, com apenas uma "linha" e várias
> > "colunas".
> > um array assim como eu o conheço, deve ter linhas e colunas.
> > tipo assim:
> >
> > array[0] = (1 2 3 4 5)      # linha 1
> > array[1] = (1 2 3 4 5)      # linha 2
> > ...
> > array[N] = (...)            # linha N
> >
> > pra depois você acessar como:
> >    array[linha][coluna]
> >
> > até onde eu vi, em shell não dá pra fazer matrizes com
> > linhas e colunas:
> >
> > > > > mas uma pergunta... dá pra trabalhar com matriz em shell?
> > > > também não sei, vamos ver:
> > > > # a[0]=(1 2 3 4)
> > > > bash: a[0]: cannot assign list to array member
> > > > Resposta: não  &:)
> >
> > mas usando a técnica do trecho do script do julio se pode
> > "simular" uma matriz com linhas e colunas se usar as
> > dezenas como linhas e as unidades como colunas.
> >
> > mas isso te limita a uma matriz de tamanho máximo de
> > 10 linhas e 10 colunas (array[99]).
> =====
8<-------------------------------------------------------->8

> -----Mensagem original-----
> De: Andreyev Dias de Melo [mailto:address@hidden]
> Enviada em: quinta-feira, 30 de dezembro de 2004 15:19
> Para: address@hidden
> Assunto: Re: [shell-script] "Bizarrices" com Arrays.
>
>
>
> On Wed, 29 Dec 2004 16:39:07 -0200, Gentil de Bortoli Júnior
> <address@hidden> wrote:
> > Pessoal, agora é minha vez de pedir um help para tentar entender
> > algumas coisas que estão acontecendo.
> >
> > Eu estou escrevendo um script que faz algumas brincadeiras com arrays.
> > Algo não saiu como eu queria e comecei a fazer testes.
> >
> > A primeira dúvida é essa:
> >
> > [gentil@gentil:~]$ variavel[11111]="Bla Bla"
> > [gentil@gentil:~]$ variavel[aaaaa]="Bla Bla"
> > [gentil@gentil:~]$ variavel[aa111]="Bla Bla"
> > [gentil@gentil:~]$ variavel[11aaa]="Bla Bla"
> > bash: 11aaa: value too great for base (error token is "11aaa")
> > [gentil@gentil:~]$
> >
> > ##### Ou seja, por que quando eu tentei definir a chave do meu array
> > com a string "11aaa" eu obtive o erro acima?
> >
> > A segunda dúvida é a seguinte:
> >
> > [gentil@gentil:~]$ variavel[11_111]="Bla Bla"
> > bash: 11_111: value too great for base (error token is "11_111")
> > [gentil@gentil:~]$
>
> Pô Gentil, cada dúvida hein?! Não achei muita coisa no google e no man
> do bash, mas talvez possamos divagar sobre isso enquanto nossos gurus
> não nos acodem! :-D
>
> No man do bash diz: "Arrays are indexed using integers and are
> zero-based.". Talvez indices com coisas não númericas sejam
> considerados como em bases diferentes da decimal, como octal ou
> hexadecimal, aí as strings que passamos podem ser muito grandes para
> serem indices nestas bases...
>
> > Obtive o erro acima. Então mudei e fiz algo assim:
> >
> > [gentil@gentil:~]$ variavel[11^111]="Bla Bla"
> > [gentil@gentil:~]$ echo ${variavel[11^111]}
> > Bla Bla
> > [gentil@gentil:~]$
> >
> > Parece que funcionou, certo? Mas aí, fui fazer mais um teste, vejam:
> >
> > [gentil@gentil:~]$ variavel[11^111]=6
> > [gentil@gentil:~]$ variavel[11^222]=7
> > [gentil@gentil:~]$ echo ${variavel[11^111]}
> > 6
>
> Parece que ele não tem problemas com ^, cada variável:
>
> $ echo ${variavel[@]}
> 6 7
>
> O tamanho do array:
>
> $ echo ${#variavel[*]}
> 2
>
> > Ok, isso funcionou como o esperado mas... o que acontece aqui?
> >
> > [gentil@gentil:~]$ variavel[1916^AAAA]=6
> > [gentil@gentil:~]$ variavel[1916^YYYY]=5
> > [gentil@gentil:~]$ echo ${variavel[1916^AAAA]}
> > 5
> > [gentil@gentil:~]$
> >
> > Ou seja, pedi o valor de uma variável e recebi o valor da outra.
>
> Acho que vc sobrescreveu sua variável:
>
> $ variavel[1916^AAAA]=6
> $ variavel[1916^YYYY]=5
> $ echo ${#variavel[*]}
> 1
> $ echo ${#variavel[@]}
> 1
>
> > E nesse último exemplo, volta a funcionar:
> >
> > [gentil@gentil:~]$ variavel[1111^YYYY]=5
> > [gentil@gentil:~]$ variavel[2222^AAAA]=6
> > [gentil@gentil:~]$ echo ${variavel[1111^YYYY]}
> > 5
> > [gentil@gentil:~]$
>
> Mas agora a parte antes do ^ mudou... Hmmm, acho que ele não lê o que
> vem depois do circunflexo se isto não for númerico...
>
> $ variavel[1111^YYYY]=5
> $ echo ${variavel[1111]}
> 5
>
> > Desculpem o e-mail grande e chato mas... não estou sacando o que está
> > acontecendo.
>
> Que isso, vc colheu bons exemplos. HIH!
> []s
> --
> Andreyev
>
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de
> programação, como perl, C etc. Quem insistir em não seguir esta
> regra será moderado sem prévio aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------

Links do Yahoo! Grupos











reply via email to

[Prev in Thread] Current Thread [Next in Thread]