2013-08-12 3 views
0

Я пытаюсь создать хэш массивов. Я беру данные из txt-файла и преобразую его в хэш массивов.Не получается вывод при создании массива массивов

Txt файл данные, как показано ниже

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

так далее ......

Я преобразование этого хэша массивов как

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

После кода я пытаюсь

%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}}; 

Я не ge вывода. В коде есть что-то не так. Пожалуйста, помогите мне понять это лучше

+0

'split '" 'будет разделен на пустую строку, что означает, что' usr1' будет разбит на 'qw (u s r 1)'. – TLP

+0

О, моя ошибка .. Я исправил, но не получил выход – Nitesh

ответ

3

Ваш код работает для меня, но проблема в том, что вы используете ключ "group1 " (обратите внимание на дополнительное пространство), а не "group1", как вы думаете. Когда вы разбиваете на двоеточие :, вы не забудьте удалить поля из пробелов, но не в поле раньше. Вы, вероятно, следует сделать:

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

Кроме того, вы всегда должны использовать

use strict; 
use warnings; 

Coding без этих двух прагмах сложно и занимает гораздо больше времени.

+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 insted '$ hash {$ array [0]} = [@arrayRef];' вам нужно 'my $ key = shift @array; $ hash {$ key} = \ @array;' но так как '@array 'не является лексическим объектом (и это должно быть), которое было бы' $ hash {$ key} = [@array]; ' –

+0

Как это имеет значение. shift @array даст последний элемент, который является индексом 1. – Nitesh

Смежные вопросы