創建一個哈希如果我有以下陣列的Perl:從陣列
my @header_line = ('id', 'name', 'age');
如何創建它等同於線下的哈希?
my %fields = { id => 0, name => 1, age => 2};
我想這樣做的原因是,我可以使用有意義的名稱而不是幻數作爲索引。例如:
$row->[$fields{age}]; # rather than $row->[2]
創建一個哈希如果我有以下陣列的Perl:從陣列
my @header_line = ('id', 'name', 'age');
如何創建它等同於線下的哈希?
my %fields = { id => 0, name => 1, age => 2};
我想這樣做的原因是,我可以使用有意義的名稱而不是幻數作爲索引。例如:
$row->[$fields{age}]; # rather than $row->[2]
my %fields;
@fields{@header_line} = (0 .. $#header_line);
+1簡明解決方案! – 2010-11-11 16:22:50
+1最常用的解決方案 – DVK 2010-11-11 16:27:59
完美運作。謝謝! – FunLovinCoder 2010-11-11 16:41:43
my %fields =();
for (my $i = 0; $i < scalar(@header_line); $i++) {
$fields{$header_line[$i]} = $i;
}
TIMTOWTDI
my %fields =();
foreach my $field(@header_line)
{
%fields{$field} = scalar(keys(%fields));
}
my %fields = map { $header_line[$_] => $_ } 0..$#header_line;
+1簡明解決方案! – 2010-11-11 16:25:33
您在回覆評論,這是從文本來:: CSV說。這個模塊有一種方法可以將它導入到你的散列中。
$csv->column_names(@header_line);
$row = $csv->getline_hr($FH);
print $row->{ 'id' };
不知道關於column_names和getline_hr - 它們是在2008年添加的,所以相對較新(使用Text :: CSV)。使代碼更加整潔... – plusplus 2010-11-11 22:22:19
I幾乎得到這個工作。問題是$ csv_o-> print($ fh_o,$ row);失敗,因爲它需要一個數組參考。我如何使用csv_o對象寫出哈希引用?順便說一句,我的腳本讀取一個CSV ,添加一些字段,更改所有列名稱(@header_line是新的col名稱),然後寫出一個新的CSV文件ILE。我不明白我需要的東西可能在我的鼻子下。 **非常感謝您的評論!** – FunLovinCoder 2010-11-12 08:37:12
我已經提出這個作爲一個新的問題,因爲這個完全不同:http://stackoverflow.com/questions/4163048/perl-with-textcsv-can-i-寫出一個哈希-REF – FunLovinCoder 2010-11-12 09:19:12
爲什麼不把'$ row'改成'%row'(哈希)? – knittl 2010-11-11 16:13:12
它來自Text :: CSV例如,我的$ row = $ csv-> getline($ fh) – FunLovinCoder 2010-11-11 16:18:10
既然你有@header_line,你可以很容易地把$ row變成一個散列:'my%row_hash = map {$ _ => shift @ {$ row}} @header_line;'。只是另一種方法,但使用'$ row_hash {age}'可能比使用'$ row - > [$ fields {age}]'表示法更清潔...... – plusplus 2010-11-11 17:54:31