arrays - 如何迭代多个 Perl 数组

标签 arrays perl iteration

我希望创建一个循环,允许我使用更少的代码行来使用 Perl 更改设置文件。目前,我的代码读取 XML 文件并找到设置 ID,并用新的 ID 替换该 ID 中的设置值。目前的请求涉及到对设置文件的修改较多,且代码很长。我已在数组中设置了值,并在数组中设置了设置 ID。像这样:

@GreetGoalDP1 = (3, 5, 7, 10);
@GreetSIDSunDP1 = ('//xsd:Settings/xsd:Setting[@SID="7012"]/xsd:Value', 
'//xsd:Settings/xsd:Setting[@SID="7013"]/xsd:Value', 
'//xsd:Settings/xsd:Setting[@SID="7014"]/xsd:Value', 
'//xsd:Settings/xsd:Setting[@SID="7015"]/xsd:Value');

并运行以下命令。

my($matchSunDP1G1) = $xpc->findnodes($GreetSIDSunDP1[0]);
$matchSunDP1G1->removeChildNodes();
$matchSunDP1G1->appendText($GreetGoalDP1[0]);
#GreetB
my($matchSunDP1G2) = $xpc->findnodes($GreetSIDSunDP1[1]);
$matchSunDP1G2->removeChildNodes();
$matchSunDP1G2->appendText($GreetGoalDP1[1]);
#GreetC
my($matchSunDP1G3) = $xpc->findnodes($GreetSIDSunDP1[2]);
$matchSunDP1G3->removeChildNodes();
$matchSunDP1G3->appendText($GreetGoalDP1[2]);
#GreetD
my($matchSunDP1G4) = $xpc->findnodes($GreetSIDSunDP1[3]);
$matchSunDP1G4->removeChildNodes();
$matchSunDP1G4->appendText($GreetGoalDP1[3]);

我想通过仅使用数组 [0] - [3] 的循环来运行这些更改,直到完成,因为我必须多次执行相同的 4 组操作。我对循环数组不太熟悉。这是我可以用 Perl 做的事情吗?如果是这样,最有效的方法是什么?

最佳答案

一个简单的例子

use warnings;
use strict;
...

for my $i (0..$#GreetGoalDP1) {
    my ($matchSunDP1G) = $xpc->findnodes( $GreetSIDSunDP1[$i] );
    $matchSunDP1G->removeChildNodes();
    $matchSunDP1G->appendText( $GreetGoalDP1[$i] );
}

我认为您不需要所有这些单独的 $matchSunDP1G1 等。假设两个数组始终具有相同的长度,并且它们的元素在相同索引处成对需要。

语法$#aryname用于数组@aryname中的最后一个索引,..range operator ,因此 0 .. $#GreetGoalDP1 对于您的示例来说是列表 0,1,2,3

还有一些库可以帮助并行使用多个数组,当事情变得更困惑或更复杂时,它们特别有用。使用迭代器的示例

use List::MoreUtils qw(each_array);

my $it = each_array @GreetSIDSunDP1, @GreetGoalDP1;

while ( my ($sidsun, $goal) = $it->() ) {
    my ($matchSunDP1G) = $xpc->findnodes($sidsun);
    $matchSunDP1G -> removeChildNodes();
    $matchSunDP1G -> appendText( $goal );
}

如果列表的大小不均匀,迭代器将继续遍历较长列表的长度。较短的一个耗尽后,其可能的值为 undef

关于arrays - 如何迭代多个 Perl 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69456675/

相关文章:

javascript - 如何将此字符串数组转换为数组对象

python - Perl 中有类似 Python Itertools 的东西吗?

recursion - 我可以在方案中使这个迭代过程递归吗?

java - 这一行中的 "int"是什么?

arrays - 是否可以用符合特定条件的行号填充数组而不循环?

c++ - OpenSSL:Nmake fatal error U1077: 'ias':返回代码 '0x1'

javascript - 如何迭代数组中的特定键值对

c - Pthreads数组 block 分布

c - 如何在C中定义非常大的二维数组(例如1000*1000)

perl - 提高 LWP::Simple perl 性能