2010-11-11 40 views
3

創建一個哈希如果我有以下陣列的Perl:從陣列

my @header_line = ('id', 'name', 'age'); 

如何創建它等同於線下的哈希?

my %fields = { id => 0, name => 1, age => 2}; 

我想這樣做的原因是,我可以使用有意義的名稱而不是幻數作爲索引。例如:

$row->[$fields{age}]; # rather than $row->[2] 
+0

爲什麼不把'$ row'改成'%row'(哈希)? – knittl 2010-11-11 16:13:12

+1

它來自Text :: CSV例如,我的$ row = $ csv-> getline($ fh) – FunLovinCoder 2010-11-11 16:18:10

+2

既然你有@header_line,你可以很容易地把$ row變成一個散列:'my%row_hash = map {$ _ => shift @ {$ row}} @header_line;'。只是另一種方法,但使用'$ row_hash {age}'可能比使用'$ row - > [$ fields {age}]'表示法更清潔...... – plusplus 2010-11-11 17:54:31

回答

15
my %fields; 
@fields{@header_line} = (0 .. $#header_line); 
+0

+1簡明解決方案! – 2010-11-11 16:22:50

+0

+1最常用的解決方案 – DVK 2010-11-11 16:27:59

+0

完美運作。謝謝! – FunLovinCoder 2010-11-11 16:41:43

1
my %fields =(); 
for (my $i = 0; $i < scalar(@header_line); $i++) { 
    $fields{$header_line[$i]} = $i; 
} 
0

TIMTOWTDI

my %fields =(); 
foreach my $field(@header_line) 
{ 
    %fields{$field} = scalar(keys(%fields)); 
} 
6
my %fields = map { $header_line[$_] => $_ } 0..$#header_line; 
+0

+1簡明解決方案! – 2010-11-11 16:25:33

2

您在回覆評論,這是從文本來:: CSV說。這個模塊有一種方法可以將它導入到你的散列中。

$csv->column_names(@header_line);
$row = $csv->getline_hr($FH);
print $row->{ 'id' };

+0

不知道關於column_names和getline_hr - 它們是在2008年添加的,所以相對較新(使用Text :: CSV)。使代碼更加整潔... – plusplus 2010-11-11 22:22:19

+0

I幾乎得到這個工作。問題是$ csv_o-> print($ fh_o,$ row);失敗,因爲它需要一個數組參考。我如何使用csv_o對象寫出哈希引用?順便說一句,我的腳本讀取一個CSV ,添加一些字段,更改所有列名稱(@header_line是新的col名稱),然後寫出一個新的CSV文件ILE。我不明白我需要的東西可能在我的鼻子下。 **非常感謝您的評論!** – FunLovinCoder 2010-11-12 08:37:12

+0

我已經提出這個作爲一個新的問題,因爲這個完全不同:http://stackoverflow.com/questions/4163048/perl-with-textcsv-can-i-寫出一個哈希-REF – FunLovinCoder 2010-11-12 09:19:12