Perl:将值添加到匿名哈希

时间:2014-03-12 20:59:18

标签: perl hash initialization

有这样的东西

my $labels = {
   1  => 'One',     2  => 'Two',
   3  => 'Three',   4  => 'Four',
   5  => 'Five',    6  => 'Six',
   7  => 'Seven',   8  => 'Eight',
   9  => 'Nine',    10 => 'Ten',
};

我想在带有变量的“For-Loop”中生成相同的东西。

    my $labels;
    my @dData = ( "One" , "Two", "dynamic Data", .. );
    my $index = @ddData;

            for(my $i = 0; $i < $index; $i++){
                            $labels{$i} = $dData[$i];

            }

但结果总是如此:

Use of uninitialized value $labels in concatenation (.) or string

2 个答案:

答案 0 :(得分:2)

这里有三个主要错误

  • 您的数组名为dData,而不是ddData。您应该在每个程序的开头始终 use strictuse warnings。这个简单的措施可以解决你的错误

  • 您的索引$i从零开始,但似乎您希望您的哈希键从一个开始

  • 要通过引用访问哈希,您需要使用间接运算符

解决这些问题

use strict;
use warnings;

my $labels;
my @dData = ( "One" , "Two", "dynamic Data");
my $index = @dData;

for (my $i = 0; $i < $index; $i++) {
  $labels->{$i+1} = $dData[$i];
}

use Data::Dump;
dd $labels;

<强>输出

{ 1 => "One", 2 => "Two", 3 => "dynamic Data" }

枚举循环元素也好得多,而不是使用C风格的for循环。这可以更好地写成

$labels->{$_+1} = $dData[$_] for 0 .. $#dData;

答案 1 :(得分:1)

您发布的代码未使用use strict;进行编译,并且应该为您提供其他警告(例如,您在一行中使用@dData,在下一行中使用@ddData)。我会使用以下内容:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $hashref;
my @data = qw(One Two Three Four);

foreach my $i (0 .. $#data) {
    $hashref->{$i+1} = $data[$i];
}

print Dumper $hashref;

输出:

$VAR1 = { 
          '4' => 'Four',
          '1' => 'One',
          '3' => 'Three',
          '2' => 'Two'
        };