【发布时间】:2015-08-26 13:56:05
【问题描述】:
我目前正在编写一个 perl 脚本,其中包含一些哈希值: (不要把这当成代码行,只是为了展示/解释)
$details{tester_name} is "UFLEX-06"
$details{op_sys} is "Windows"
$details{igxl_vn} is "8.00.01_uflx (P7)"
$details{slot} -> see below for details
$details{board_name} -> see below for details
现在在 $details{slot} 我有多个索引,每个索引都包含一个值。
$details{slot} [0] has "2"
$details{slot} [1] has "5"
等等。 $details{slot} 的索引数量与 $details{board_name} 相同。
现在我想遍历这个但根据$details{slot}。
到目前为止,我所做的仅迭代 %details:
foreach my $key(keys %details)
{
print {$fh} "INSERT INTO TesterDeviceMatrix.TBL_TESTER_INFO"
."(tester_name, operating_system , version, board_name , config , date_modified ) "
."VALUES ('$details{tester_name}', '$details{op_sys}', '$details{board_name}', "
."'$details{igxl_vn}', '$details{slot}', '$timestamp');\n";
}
但我想做的是类似
foreach my $key(keys %details{slot}) -> or %details{board_name}
{
print {$fh} "INSERT INTO TesterDeviceMatrix.TBL_TESTER_INFO"
."(tester_name, operating_system , version, board_name , config , date_modified ) "
."VALUES ('$details{tester_name}', '$details{op_sys}', '$details{board_name}', "
."'$details{igxl_vn}', '$details{slot}', '$timestamp');\n";
}
我知道这是错误的,但这只是为了表明我的想法。
我现在得到的输出是:
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VirtualDSPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VirtualDSPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VirtualDSPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VirtualDSPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VirtualDSPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
上面的输出有 5 行,因为有 5 个哈希值。但是我想要的是 8 行的值根据其索引,因为 $details{slot} 有 8 个索引,这意味着 $details{board_name} 也有 8 个索引。
我想要的输出的一个例子是(注意值差异和 8 行):
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'abcBrd', '8.00.01_uflx (P7)', '2.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VqwelDSPBrd', '8.00.01_uflx (P7)', '5.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'DiffDSPBrd', '8.00.01_uflx (P7)', '8.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', '123DSPBrd', '8.00.01_uflx (P7)', '26.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'V1r12alDSPBrd', '8.00.01_uflx (P7)', '56.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'VMamaBrd', '8.00.01_uflx (P7)', '52.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ONSPBrd', '8.00.01_uflx (P7)', '56.0', '2015-06-11 11:15:33');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'bankaiPBrd', '8.00.01_uflx (P7)', '66.0', '2015-06-11 11:15:33');
所以问题是我如何迭代然后根据哈希 $details{slot} 中有多少索引进行打印,$details{slot} 和 $details{board_name} 将根据它们的索引打印?
我知道我必须在我拥有的当前循环中创建另一个 for 循环。但是,大多数解决方案都是针对只包含一个值的哈希,因此它不能满足我的需求。
编辑:
(注意:此转储仅显示最新的board_name 和slot)
{
board_name => "Virtualabc"
igxl_vn => "9.0.0_abc"
op_sys => "Windows"
slot => "66.0"
tester_name => "UNFEK-02"
}
编辑 2:
按照@shivams 的建议,我已经编辑了我的脚本,将slot 和board_name 声明为数组。
push @{ $details{slot} }, [$1];
push @{ $details{board_name} }, [$2];
现在,正如 Dmitry 的回答(第一部分)所建议的那样,我只得到了对数组的引用。这是输出:
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [0]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [0]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [1]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [1]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [2]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [2]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [3]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [3]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [4]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [4]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [5]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [5]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [6]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [6]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [7]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [7]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [8]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [8]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [9]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [9]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [10]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [10]', '2015-06-11 15:18:37');
INSERT INTO TBL_TESTER_INFO(tester_name, operating_system , version, board_name , config , date_modified ) VALUES ('UFLEX-06', 'Windows XP', 'ARRAY(0x1d2fb98) [11]', '8.00.01_uflx (P7)', 'ARRAY(0x1d40288) [11]', '2015-06-11 15:18:37');
我如何获得确切的值?
【问题讨论】:
标签: arrays perl loops hash hashmap