AJBM 28 Posted October 1, 2013 Report Share Posted October 1, 2013 Boas! Eu tenho este codigo. #!/usr/bin/perl open(FICH,"dados") || die "erro abrir o ficheiro"; while ($linha=<FICH>){ chomp($linha); @list= split(";",$linha); my @valor=($list[1],$list[2],$list[3],$list[4],$list[5]); $ref=\@valor; if($hash{$list[0]} ne undef){ my @newValor=($hash{$list[0]},$ref); $hash{$list[0]}=\$newValor; } else{ $hash{$list[0]} =$ref; } } #print $hash{435353}."\n"; O que queria era imprimir o conteudo da hash, mas nao estou a conseguir. A minha %hash é contituida por uma chave e por um valor, sendo este valor uma referencia para um array. Pode tambem acontecer o valor ser uma referencia para um array, e esse mesmo array ter uma outra referencia para outro array. Ja andei com foreach mas nao consegui. Agora esta a tentar imprimir o conteudo de so uma coisa. Link to post Share on other sites
eatg75 18 Posted October 1, 2013 Report Share Posted October 1, 2013 (edited) #!/usr/bin/env/perl # tendo o Shebang assim torna o teu codigo mais portavel. # o Perl vai nao veraso 5.18 com o teu codigo assim nao estas a tirar proveito dos # melhoramentos introduzidos na linguagem desde a versao 5.10. # podias fazer algo como. use 5.0120; # utilizar a versao 5.12 da linguagem (desde a versao 5.12 o 'use strict' e implicito). use warnings; # open(FICH,"dados") || die "erro abrir o ficheiro"; open(my $FICH, '<', 'dados') or die ' erro abrir o ficheiro'; # utiliza a versao do open() que recebe 3 argumentos, # essa versao e mais segura, em strings se nao estas a # a interpolar varias utiliza plicas para delimitar a string e # nao aspas. while (my $linha = <FICH>) { # my() por causa do 'use strict' chomp $linha; # a chamada de chomp() assim e mais perlish. my @list = split q/;/, $linha; # mais legivel e perlish. # my @valor = ($list[1],$list[2],$list[3],$list[4],$list[5]); # podias substituir a linha anterior por algo como : my @valor = @list[1 .. 5]; # utilizas 'slices' para acederes a alguns elementos da lista, e como o contexto e 'list' e devolvido uma lista. my $ref = \@valor; # if ($hash{$list[0]} ne undef) { # a forma correcta de verificar se um elemento existe na lista e utilizando a funcao exists(). # onde e que esta a declaracao do %hash? # sendo assim a forma correcta seria : if (exists $hash{$list[0]}) { # my @newValor = ($hash{$list[0]}, $ref); # aqui estas a colocar a referencia do array e nao o conteudo do array referenciado. # para dereferenciar um array utilizas a seguinte sintaxe : @$array_ref, mas e uma boa pratica utilizar esta sintaxe # @{$array_ref} em vez da forma que mostrei. my @newValor = ($hash{$list[0]}, @{$ref}) $hash{$list[0]} = \$newValor; # podias substituir as 2 linhas anteriores por algo como : # my $new_valor = [$hash{$list[0]}, @{$ref}]; # $hash{$list[0]} = $new_valor; # que e mais perlish. else{ $hash{$list[0]} = $ref; } } # print $hash{435353}."\n"; ??? # utiliza a funcao say() ao invez do print(). @AJBM porque nao dizes antes o proposito do teu codigo antes de comecar colocar as tuas duvidas? EDIT: corrigi um typo na declaracao do array anonimo. Edited October 1, 2013 by eatg75 1 Report Victarion seized the dusky woman by the wrist and pulled her to him. Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see. Moqorro's dark eyes seemed to shine. Moqorro - I see dragons. Link to post Share on other sites
AJBM 28 Posted October 1, 2013 Author Report Share Posted October 1, 2013 O propósito é ler os dados de um ficheiro para uma hashtable, quando houver chaves repetidas em vez de reescrever, junto ao que ja tenho. Listar os dados da HashTable Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now