【发布时间】:2020-02-03 18:49:47
【问题描述】:
系统:Ubuntu 18.04 上的 Perl 5.26.1。
我们将 Ubuntu 升级到 18.04,将 Perl 升级到 5.26,现在不再支持我在 Perl 5.18 中使用二维哈希的实验方式。这是我使用实验性东西的错。
我的目标:我正在尝试使用新的方法来做散列的散列,或 2 个键的散列,或 2d 散列。 IE。一个哈希有 2 个键,一个部门,每个部门都有一个或多个员工 ID。哈希中也可以有多个部门作为第一个键。我正在从 SQL 语句的结果中读取数据,因此我必须为每个员工 ID 添加小时数。部分问题是我先读了部门,然后我得到了empid。
问题:我在获取 empid 的第二个循环中遇到错误。运行时错误是:“在使用“严格引用”时,不能使用字符串 (“6”) 作为 HASH 引用”。
- 我一直在进行研究,但找不到适合我的案例的具体示例,示例与我正在做的不同,或者我尝试的示例不起作用并给我一个错误。
- 我读过的页面中至少有一半没有日期,所以我什至无法猜测它们是用于什么版本的 perl。
- 关于此主题的 perldocs 与我在 Internet 上找到的其他页面相同。
- 我不能只为这份报告使用简单的 SQL 语句,因为在获得每个员工的数据后,我必须做更多的处理。
- 我尝试了几种代码排列,但都没有成功。但我在这里排除了这些排列。
- 出于某种原因,我在 Internet 上找到的大多数示例都不适用于 Perl 5.26。
这是我的代码。我已经尝试了来自不同来源的几种排列以使其正常工作。
use strict;
use warnings;
use Data::Dumper;
####################
# Variables
my $i=0;
my $s='';
my $t='';
my $k='';
my $k2='';
my $empid='';
my $z='';
my @k=(); # Key list
my @k2=(); # Key list
my %hashs=(); # Scalar hash, works.
my %empees=();
my $pos=0;
my $val="Myval";
my $dept='';
####################
$s="Data::Dumper $Data::Dumper::VERSION";
print "$s\n";
print "\n";
$empees{'JSMITH'}=1.0; # WORKS
$empees{'RGREEN'}=2.0;
$empees{'KJONES'}=3.0;
$hashs{950}=%empees;
$empees{'WSMIT'}=1.5;
$empees{'AMCBE'}=2.5;
$empees{'SCHWAR'}=3.5;
$hashs{800}=%empees;
# Now print out values in 2d hash.
@k=keys(%hashs);
print "Keys and values are:\n";
foreach $dept (sort keys %hashs)
{
for $empid (sort keys %{$hashs{$dept}} ) # ERROR is here
{
$val=$hashs{$dept}{$empid};
$t="$dept $empid $val";
print "$t\n";
} # foreach $empid
} # foreach $dept
- 有人可以帮我吗?
- 除了散列哈希之外,还有其他方法可以完成此任务吗?
感谢您的所有帮助!非常感谢您的宝贵时间!
【问题讨论】:
-
你之前在做什么?自 Perl 5.0 以来,执行此操作的常用方法已基本修复。
-
此代码:
$hashs{950}=%empees不符合您的想法?它分配的值等于%empees中的键数。