如何打印用作%hash值的@array的$元素?

时间:2016-10-07 11:11:36

标签: arrays perl hash perl-data-structures

我认为对于有经验的人来说这应该很容易解决,对我来说虽然我在谷歌上尝试和搜索这个但是找不到适合我情况的东西。我只想让$ amountok和$ amountko给出它们在索引0和1处的值,但它不是这样的(见#marks)。

print ERGEBNIS "ID;Amount;Amount OK;Amount KO\n";
foreach my $key (keys %elementhash){
  my $sum = 0;              
  foreach $valueofkey(@{$elementhash{$key}}){                   
     $sum += $valueofkey;           
  }

  #my $amountok= @{$elementhash{$key}[0]};
  #my $amountko= @{$elementhash{$key}[1]};

  print ERGEBNIS $key.";".$sum.";".$amountok.";".$amountko."\n";

}

这会让我错误:"不能使用字符串" 7"作为一个数组引用,这必须是可能的,但我不知道如何!谢谢你们

这是%elementhash的转储输出:

 $VAR1 = {                '1000' => [7],               
                          '2000' => [5],                  
                          '3000' => [56, 12]              
         };                     

1 个答案:

答案 0 :(得分:5)

您的哈希元素包含数组引用。即使数组ref中只有一个值,它仍然是数组引用。您可以使用->运算符进行解除引用。

$elementhash{$key}->[0];

请注意,您首先使用哈希,而不是哈希引用,因此{$key}部分之前没有箭头。里面有一个数组引用。实际上,您并不需要在->前放置[0],因为Perl知道嵌套数据结构是从引用构建的。这是been well discussed的偏好问题。我个人喜欢箭头,但这里不需要 1

您尝试对@{$elementhash{$key}[0]}尝试的是$key内的第一个元素,e。 G。密钥7的{​​{1}},并将其作为数组deref。当然你不能这样做,因为它是一个数字,而不是一个数组引用。

因为并非数据结构中的所有数组都有两个值,所以应检查第二个值是否存在。您可以使用1000 defined-or运算符执行此操作。它允许//或其他非真值,但不允许0

最后,您错过了undef的{​​{1}}。

my

请注意,您可以重写最后一行以使用$valueofkey

use strict;
use warnings;

my %elementhash = (
    '1000' => [7],
    '2000' => [5],
    '3000' => [ 56, 12 ]
);

print "ID;Amount;Amount OK;Amount KO\n";
foreach my $key ( keys %elementhash ) {
    my $sum = 0;
    foreach my $valueofkey ( @{ $elementhash{$key} } ) {
        $sum += $valueofkey;
    }

    my $amountok = $elementhash{$key}->[0];
    my $amountko = $elementhash{$key}->[1] // 0;

    print $key. ";" . $sum . ";" . $amountok . ";" . $amountko . "\n";
}

如果你的Perl至少是5.10版,你也可以打开join,这样就不需要打印print join( ';', $key, $sum, $amountok, $amountko ), "\n";

use feature 'say'

如果您有更复杂的CSV,请考虑改为使用Text::CSVText::CSV_XS

1)如果您开始的变量是引用,则确实需要一个箭头。但是可以省略以下内容。

"\n"