AJBM Posted October 1, 2013 at 02:04 PM Report #526990 Posted October 1, 2013 at 02:04 PM 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.
eatg75 Posted October 1, 2013 at 03:06 PM Report #527009 Posted October 1, 2013 at 03:06 PM (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 at 03:07 PM 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.
AJBM Posted October 1, 2013 at 06:41 PM Author Report #527070 Posted October 1, 2013 at 06:41 PM 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
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