如何打印用作 %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";
}
这会给出错误:"Cant use string "7" as an array ref.",这一定是可行的,但我只是不知道如何!谢谢大家
这是 %elementhash 的 Dumper 输出:
$VAR1 = { '1000' => [7],
'2000' => [5],
'3000' => [56, 12]
};
您的散列 元素 包含数组引用。即使数组引用中只有一个值,它仍然是一个数组引用。您可以使用->
运算符来取消引用。
$elementhash{$key}->[0];
请注意,您首先有一个散列,而不是散列引用,因此 {$key}
部分之前没有箭头。里面有一个数组引用。事实上,你不需要在 [0]
前面放一个 ->
因为 Perl 知道嵌套数据结构是从引用构建的。这是 been well discussed 的偏好问题。我个人喜欢箭头,但这里不需要1.
您尝试用 @{$elementhash{$key}[0]}
做的是获取 $key
中的第一个元素,即。 G。键 1000
的 7
,并将其取消引用为数组。当然你不能这样做,因为它是一个数字,而不是数组引用。
因为并非数据结构中的所有数组都有两个值,所以您应该检查第二个值是否存在。您可以使用 //
定义或运算符来做到这一点。它允许 0
或其他不真实的值,但不允许 undef
.
最后,您缺少 $valueofkey
的 my
。
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::CSV or Text::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
我认为这对有经验的人来说应该很容易解决,对我来说,虽然我在 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";
}
这会给出错误:"Cant use string "7" as an array ref.",这一定是可行的,但我只是不知道如何!谢谢大家
这是 %elementhash 的 Dumper 输出:
$VAR1 = { '1000' => [7],
'2000' => [5],
'3000' => [56, 12]
};
您的散列 元素 包含数组引用。即使数组引用中只有一个值,它仍然是一个数组引用。您可以使用->
运算符来取消引用。
$elementhash{$key}->[0];
请注意,您首先有一个散列,而不是散列引用,因此 {$key}
部分之前没有箭头。里面有一个数组引用。事实上,你不需要在 [0]
前面放一个 ->
因为 Perl 知道嵌套数据结构是从引用构建的。这是 been well discussed 的偏好问题。我个人喜欢箭头,但这里不需要1.
您尝试用 @{$elementhash{$key}[0]}
做的是获取 $key
中的第一个元素,即。 G。键 1000
的 7
,并将其取消引用为数组。当然你不能这样做,因为它是一个数字,而不是数组引用。
因为并非数据结构中的所有数组都有两个值,所以您应该检查第二个值是否存在。您可以使用 //
定义或运算符来做到这一点。它允许 0
或其他不真实的值,但不允许 undef
.
最后,您缺少 $valueofkey
的 my
。
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::CSV or Text::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