2013-12-12 2 views
0

У меня есть данные в массиве, какСоздания хэша из массива в Perl

$a[0] = (a1,b1,c1); 
$a[1] = (a2,b2,c2); # and so on 

Я хочу, чтобы создать хэш, где первый элемент является ключевым и вторым и третьим элементом являются значениями

Так a1 => b1 и a2 => b2

Любая помощь приветствуется

if (open(MYFILE, "Task1.txt")) { 
    @airportdata = <MYFILE>; 
    close(MYFILE); 
} else { 
    print "The File Does Not Exist!\n"; 
    exit 1; 
} 
+0

'мой% хэш;' '@hash {@ {$ а [0]}} = @ {$ а [1]};' – foibs

+0

Как вставить 2 элемента как значение ключа? – m0skit0

+0

Вы можете предложить одну вещь (значения с несколькими элементами), но ваш желаемый результат предполагает другое (одноэлементное значение). Каков ваш желаемый результат? – Kenosis

ответ

3

Попробуйте следующее, который даст вам хэш, заполненный массивом refs. Я предположил, что первым значением является ключ.

use strict; use warnings; 

my %airportdata; 
open(my $fh, '<', "Task1.txt") or die $!; 
while (my $line = <$fh>) { 
    chomp $line; 
    my @fields = split /,/, $line; 
    $airportdata{$fields[0]} = [ @fields[1,2] ]; 
} 
close($fh); 

__END__ 
%airportdata = (
    'a1' => ['b1', 'c1'], 
    'a2' => ['b2', 'c'], 
); 

Вы должны всегда use strict и use warnings. Проверка работоспособности open была выполнена, но я изменил ее, чтобы сделать код более читаемым. Кроме того, всегда используйте три аргумента open.

Кроме того, я использую срез массива для одновременного доступа к обоим полям 1 и 2, возвращая список.

+0

Спасибо, что выполнили эту работу. Хотя [@fields [1,2]] не дал мне значения, а скорее странного результата Array [0x0000b], когда я пытаюсь получить значение ключа – user3096268

+1

Я полагаю, что вы имели в виду 'close ($ fh);'. – Kenosis

+0

@ Kenosis спасибо. - Это ссылка на массив. Это способ Perl создавать многоуровневые структуры данных. Вы должны прочитать их в [perlref] (http://perldoc.perl.org/perlref.html). – simbabque

0

Вот еще один пример

use strict; 
use warnings; 

my @likeafile=(q(a1, b1, c1), 
       q(a2, b2, c2), 
       q(a3, b3, c3), 
       q(antelope, brisket, cloud)); 
my %hash=(); 
for my $l (@likeafile) { 
    my @a=split(/\s*,\s*/,$l); 
    $hash{$a[0]} = [@a[1..2]]; 
} 

#simple access example 
my $key="a3"; 

my $first=$hash{$key}[0]; 
my $second=$hash{$key}[1]; 

print "FAIL $first $second \n" unless ($first eq 'b3' and $second eq 'c3'); 

#find all 3rd elements that are longer than 3 characters 
for my $key (keys %hash) { 
    my $second=$hash{$key}[1]; 
    print "$second\n" if (length($second) > 3); 
} 
Смежные вопросы