繁体   English   中英

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

[英]How to print an $element of an @array that is used as a value of %hash?

我认为这对有经验的人来说应该很容易解决,对我来说,尽管我正在尝试并在Google上搜索有关此内容的信息,但找不到适合我情况的任何内容。 我只想让$ amountok和$ amountko给出它们在索引0和1处的值,但它不能像这样工作(请参阅#号)。

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的Dumper输出:

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

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

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

请注意,您首先有一个哈希,而不是哈希引用,因此{$key}部分之前没有箭头。 里面有一个数组引用。 实际上,由于Perl知道嵌套数据结构是根据引用构建的,因此您不必严格地在[0]前面放置-> 优先考虑的问题已经得到充分讨论 我个人喜欢箭头,但是这里不需要1

您尝试使用@{$elementhash{$key}[0]}是将$key的第一个元素(例如,键10007作为一个数组,并将其取消引用。 当然,您不能这样做,因为它是一个数字,而不是数组引用。

因为并非数据结构中的所有数组都有两个值,所以应检查第二个值是否存在。 您可以使用//定义或运算符来实现。 它允许0或其他不真实的值,但不允许undef

最后,您错过了my for $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";
}

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

print join( ';', $key, $sum, $amountok, $amountko ),  "\n";

如果您的Perl至少是5.10版,则还可以启用use feature 'say'因此不需要打印"\\n"

say join ';', $key, $sum, $amountok, $amountko;

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


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

my $foo = { bar => [1, 2, 3] };
say $foo->{bar}[2]; # works
say $foo{bar}[2]; # complains that %foo needs explicit package name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM