2013-08-12 3 views
0

배열의 해시를 생성하려고합니다. 나는 txt 파일에서 데이터를 가져 와서 배열의 해시로 변환하고있다. 내가해시 오브 배열 생성 중에 출력되지 않음

을 시도하고 코드를 다음

%hash = (group1 => [usr1 usr4 usr6], group2 => [usr2 usr1 usr5]); 

같은 배열의 해시를 변환하고

...... 등등

group1 : usr1 usr4 usr6 
group2 : usr2 usr1 usr5 
group3 : usr1 usr2 usr3 

아래로

TXT 파일의 데이터는

%hash =(); 
open (FH, "2.txt") or die "file not found"; 
while (<FH>) { 
@array = split (":", $_); 
$array[1] =~ s/^\s*//; 
$array[1] =~ s/\s*$//; 
@arrayRef = split (" ", $array[1]); 
$hash{$array[0]} = [ @arrayRef ]; 
#print @array; 
#print "\n"; 
} 
close FH; 


print $hash{group1}[0]; 
print @{ $hash{group2}}; 

나는 출력. 코드에 뭔가 잘못되었습니다. 이해를 도와주세요 더 잘

+0

'split ""'빈 문자열에 나뉘어집니다. 즉,'usr1'은'qw (u s r 1)'로 분리 될 것입니다. – TLP

+0

오, 제 실수 ... 수정했지만 출력이 나오지 않습니다 – Nitesh

답변

3

귀하의 코드는 나를 위해 작동하지만 문제는 당신이 생각하는 것처럼 당신이 (여분의 공간주의) 키 "group1 "를 사용하지 "group1"한다는 것이다. 콜론 :으로 분할 할 때는 공백에서 필드를 제거해야하지만 이전 필드에서는 제거하지 마십시오. 당신은 아마 수행해야합니다

my @array = split /\s*:\s*/, $_; 

또한, 당신은 항상이 두 프라그 마를없이

use strict; 
use warnings; 

코딩을 사용한다 어렵고 훨씬 더 오래 걸립니다.

+0

감사합니다. 지금 일하고있다. – Nitesh

1
use strict; 
use warnings; 

my %hash; 
open (my $FH, "<", "2.txt") or die $!; 
while (<$FH>) { 
    my ($key, @array) = split /[:\s]+/, $_; 
    $hash{$key} = \@array; 
} 
close $FH; 

use Data::Dumper; 
print Dumper \%hash; 
+0

내 코드가 잘못되었습니다. – Nitesh

+0

@Nitesh는'$ hash {$ array [0]} = [@arrayRef];''my $ key = shift @array; $ hash {$ key} = \ @array; '가 필요하지만'@array 'lexicaly 범위가 아니며 ($이어야한다) $ hash {$ key} = [@array]; –

+0

차이점은 무엇인가? shift @array는 인덱스 1 인 마지막 요소를 제공합니다. – Nitesh

관련 문제