我希望創建一個回圈,允許我使用更少的代碼行來使用 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 中做的事情嗎?如果是這樣,那么最有效的方法是什么?
uj5u.com熱心網友回復:
一個簡單的
use warnings;
use strict;
...
for my $i (0..$#GreetGoalDP1) {
my ($matchSunDP1G) = $xpc->findnodes( $GreetSIDSunDP1[$i] );
$matchSunDP1G->removeChildNodes();
$matchSunDP1G->appendText( $GreetGoalDP1[$i] );
}
我認為你不需要所有這些個體$matchSunDP1G1等等。假設兩個陣列總是具有相同的長度,并且它們的元素在相同的索引處成對需要。
語法$#aryname用于陣列中的最后一個索引@aryname,并且..是范圍運算子,因此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。
uj5u.com熱心網友回復:
以下代碼示例演示了如何使用%hash您嘗試實作的交替。
my %hash = (
3 => '//xsd:Settings/xsd:Setting[@SID="7012"]/xsd:Value',
5 => '//xsd:Settings/xsd:Setting[@SID="7013"]/xsd:Value',
7 => '//xsd:Settings/xsd:Setting[@SID="7014"]/xsd:Value',
10 => '//xsd:Settings/xsd:Setting[@SID="7015"]/xsd:Value')
);
while( my($k,$v) = each %hash ) {
my $match = $xpc->findnodes($v);
$match->removeChildNodes();
$match->appendText($k);
}
參考:hash,散列操作
uj5u.com熱心網友回復:
另一種方式,zip從核心List::Util模塊使用:
#!/usr/bin/env perl
use warnings;
use strict;
use List::Util qw/zip/;
...;
my @GreetGoalDP1 = (3, 5, 7, 10);
my @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');
foreach my $pair (zip \@GreetSIDSunDP1, \@GreetGoalDP1) {
my ($matchSunDP1G1) = $xpc->findnodes($pair->[0]);
$matchSunDP1G1->removeChildNodes();
$matchSunDP1G1->appendText($pair->[1]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316264.html
