Perl 数组推送的一个问题
我在代码中使用了两个哈希。一,Perl 数组推送的一个问题,perl,Perl,我在代码中使用了两个哈希。一, Dumper \%userJobCount $VAR1 = { 'hina' => 2, 'maccetta' => 1, 'vineethk' => 1, 'jpriyank' => 27, 'sanchars' => 1, 'kamran' => 8, 'wilt' => 7,
Dumper \%userJobCount
$VAR1 = {
'hina' => 2,
'maccetta' => 1,
'vineethk' => 1,
'jpriyank' => 27,
'sanchars' => 1,
'kamran' => 8,
'wilt' => 7,
'sakir' => 5,
'rjernigan' => 8,
'emichael' => 1,
'ranjith' => 8,
'wgutknec' => 7,
'danchuy' => 1,
'saurabh4' => 1,
'chengc' => 9,
'revathi' => 2,
'zumach' => 7,
'hual' => 7,
'lkashyap' => 2,
'raviteja' => 17,
'bsheetal' => 4,
'horgan' => 2,
'tongz' => 6,
'demat' => 1,
'matthew6' => 14,
'alward' => 1,
'adalton' => 1,
'sydneyw' => 5,
'yashodhc' => 1,
'makam' => 1,
'surajs' => 9,
'radish' => 2,
'sudiptac' => 2,
'adityak' => 4,
'dodgson' => 4,
'sudipp' => 6,
'zaw' => 1,
'umeshr' => 23,
'zukas' => 6
};
及
下面是我使用它们的代码:
foreach my $key (keys %userJobCount) {
if( $userJobCount{$key} > $jobLimit) {
%userJobSubtest = (
name => $key,
username => $key,
rc => WARN,
notes => ''
);
#print Dumper \%userJobSubtest;
push(@{$rtn{subtests}}, \%userJobSubtest);
}
}
print Dumper %rtn;
我将仅显示总输出中的子测试键值:
$VAR6 = [
{
'rc' => 3,
'notes' => '',
'name' => 'umeshr',
'username' => 'umeshr'
},
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0],
$VAR6->[0]
];
在代码中,此部分被注释掉:
#print Dumper \%userJobSubtest;
当我运行它时,它有其他键的值,这些键的值超过$jobLimit(=5)
有人知道推车出了什么问题吗?当我推送的内容实际上不应该是相同的值时,为什么会得到重复的条目?您使
@{$rtn{subtests}}
的每个元素都引用了相同的散列
修正:
my
创建一个变量。始终使用严格使用;使用警告qw(全部)代码> PS-如果将对散列和数组的引用传递到转储程序
,您将获得更好的结果。例如,打印转储程序%rtn代码>应该是打印转储\%rtn代码>。在本例中,打印转储程序$rtn{subtests};`那就更好了,这起作用了。规范要求使用严格;使用警告代码>与使用警告qw(全部)有什么区别代码>?这意味着您也在删除其他一些散列,并且现在在作用域中有两个同名的变量。重命名其中一个,我一点都不懂。对\%userJobSubtest
的引用应指向%userJobSubtest
。因此,当%userJobSubtest
的值更改时,引用不也应该指向新值吗?很抱歉,我对引用感到困惑。Re“引用不应该也指向新值吗?”,是的,它确实指向了。这就是你要我们解决的问题。通过将单个%userJobSubtest
替换为每次循环都创建的新测试,问题就解决了。没错,问题得到了解决,因为我使用my
重新声明了哈希。我想问的是为什么my
在这里很重要?如果不使用my
,为什么在我更改哈希值后,引用没有指向新值?为什么它仍然指向旧的值?
#print Dumper \%userJobSubtest;
my %userJobSubtest = (
name => $key,
username => $key,
rc => WARN,
notes => ''
);
push(@{$rtn{subtests}}, \%userJobSubtest);