【问题标题】:Perl: Create a hash from an arrayPerl:从数组创建哈希
【发布时间】:2011-05-08 13:47:51
【问题描述】:

如果我有以下数组

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

如何从它创建一个与下面一行等效的哈希?

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

我想这样做的原因是我可以使用有意义的名称而不是幻数作为索引。例如:

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

【问题讨论】:

  • 为什么不将$row 更改为%row(哈希)?
  • 它来自 Text::CSV 例如,my $row = $csv->getline($fh)
  • 既然你有@header_line,你可以很容易地将$row变成一个哈希:my %row_hash = map { $_ => shift @{$row} } @header_line;。只是另一种选择,但使用$row_hash{age} 可能比必须使用$row->[$fields{age}] 表示法更干净......
  • 既然你有@header_line,你可以很容易地把$row变成一个哈希:my %row_hash; @row_hash{@header_line} = @{$row};。我不得不考虑一下您的代码是如何工作的,而哈希切片要干净得多。

标签: arrays perl data-structures hash


【解决方案1】:
my %fields = ();
for (my $i = 0; $i < scalar(@header_line); $i++) {
   $fields{$header_line[$i]} = $i;
}

【讨论】:

    【解决方案2】:

    TIMTOWTDI

    my %fields = ();
    foreach my $field(@header_line)
    {
      $fields{$field} = scalar(keys(%fields));
    }
    

    【讨论】:

      【解决方案3】:
      my %fields;
      @fields{@header_line} = (0 .. $#header_line);
      

      【讨论】:

      • @swisstony:我突然想到,如果你的索引是静态已知的,常量会更方便。 use constant { id =&gt; 0, name =&gt; 1, age =&gt; 2}; print $row-&gt;[age];
      • 我明白了,但是我必须维护两个数据结构。我已经有一个名为 header_line 的数组,用于打印列名 ($csv->print($fh, get_header_line();)。我还必须为索引维护一个单独的哈希。我应该说我实际上有header_line 中大约有 40 个列名,而不是我的示例中的 3。我想如果我可以将 header_line 创建为来自哈希的数组的引用,这将是 Text::CSV 想要的,但我不确定怎么做。
      【解决方案4】:
      my %fields = map { $header_line[$_] => $_ } 0..$#header_line;
      

      【讨论】:

        【解决方案5】:

        您在回复评论时说这是来自 Text::CSV。该模块有一种方法可以为您将其导入哈希。

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

        【讨论】:

        • 不知道 column_names 和 getline_hr - 它们是在 2008 年添加的,所以相对较新(就 Text::CSV 而言)。让代码更整洁...
        • 我差点搞定了。问题是 $csv_o->print( $fh_o, $row );失败,因为它需要一个数组引用。如何使用 csv_o 对象写出哈希引用?顺便说一句,我的脚本读入一个 CSV,添加一些字段,更改所有列名(@header_line 是新的列名),然后写出一个新的 CSV 文件。我没有意识到我需要的东西可能就在我的眼皮底下。 非常感谢您的评论!
        • 我已将此作为一个与此完全不同的新问题提出:stackoverflow.com/questions/4163048/…
        猜你喜欢
        • 2011-04-20
        • 2013-12-20
        • 2018-08-26
        • 2019-06-01
        • 1970-01-01
        • 2018-04-11
        • 2014-02-27
        • 2012-03-27
        • 1970-01-01
        相关资源
        最近更新 更多