Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 数组推送的一个问题_Perl - Fatal编程技术网

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);