在Perl中从数组创建哈希

时间:2013-12-12 16:40:57

标签: arrays perl hash

我有像

这样的数组中的数据
$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;
}

2 个答案:

答案 0 :(得分:3)

尝试以下操作,它将为您提供一个填充数组引用的哈希值。我假设第一个值是关键。

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 strictuse warnings。检查open是否工作得很好,但我更改了它以使代码更具可读性。此外,始终使用三参数open

此外,我正在使用数组切片同时访问字段1和2,返回一个列表。

答案 1 :(得分: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);
}