Jump to content
AJBM

Hashtable

Recommended Posts

AJBM

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.

Share this post


Link to post
Share on other sites
eatg75

#!/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 by eatg75
  • Vote 1

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.

Share this post


Link to post
Share on other sites
AJBM

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.