繁体   English   中英

遍历具有多个索引的哈希中的哈希数组

[英]Iterating through a array of hashes in a hash that has multiple indexes

我目前正在编写一个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_nameslot

{
    board_name => "Virtualabc"
    igxl_vn => "9.0.0_abc"
    op_sys => "Windows"
    slot => "66.0"
    tester_name => "UNFEK-02"
}

编辑2:

我已经编辑了脚本,并按照@shivams的建议将slotboard_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');

我如何获得确切的价值?

foreach my $key(keys %details) {
 if (ref($key)  eq 'ARRAY') {
   foreach $key2 (@$key) {
      PRINT STATEMENT
   }
 }
 else {
  PRINT STATEMENT
 }
}

这样,当哈希中存在数组时,您的代码将通过内部foreach循环在该数组上循环,如果没有,则转到else数组。 现在也要如何完全使用价值。

您实际上不需要遍历keys %details 我认为,您已经根据Borodin的建议( 从将日志文件中的数据提取到Perl hash中)建立了%details 哈希 在这种情况下,您实际上并不是哈希数组,而是单个哈希%details其中包含两个列表(以及其他一些标量值)。

为了从中准备所需的插入语句集,您应该仅迭代%details的子列表。 %details的标量字段应直接访问:

for (my $i = 0; $i < @{$details{slot}}; $i++) {
    print
        "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}[$i]', "
        ."'$details{igxl_vn}', '$details{slot}[$i]', '$timestamp');\n";
}

是说明上述内容的测试脚本。

EDIT 2之后的更新:

更改

push @{ $details{slot} }, [$1];
push @{ $details{board_name} }, [$2];

push @{ $details{slot} }, $1;
push @{ $details{board_name} }, $2;

[$var] (即带有方括号的标量变量)推入数组将在数组中填充一个每个包含此单个标量值的单元素子数组。 这是因为[$var]构造了对包含单个元素$var的数组的引用。 相反,您实际需要的只是推标量值本身。

PS

考虑使用参数化查询而不是硬编码查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM