2016-02-08 34 views
-1

對於下面的代碼,我試圖在foreach語句中包含另一個循環。 我有兩個列表。 第一個「項目」是我的列表,我檢查元素是否爲零。 第二個列表「varis」是我的列表,其值保存爲值不爲零的情況。如何在Perl中將循環集成到另一個循環中

我想檢查我的列表「item」中的值是否爲零,如果是這樣,則將元素設置爲零。 如果未將第一個元素的值設置爲列表varis中列出的第一個值。 第二個元素也一樣。如果第二個元素不爲零,則將該值設置爲varis中列出的第二個值,依此類推。 到目前爲止,我用foreach語句來檢查我的「item」列表中的元素。 但是我不知道如何去關於我的第二個列表。 我正在考慮將第二個循環集成到我的foreach語句中。 但我不知道如何。

$sums = (2+4+5+6+5+10+4); 
my @item=(0,50,5,3,5,15,0); 
$sum = 0; 
my @varis = (2,4,5,6,5,10,4); 

foreach my $item(@item){ 
     if ($item==0) {$item=0} # if element in item is zero set element as zero 
      else {$item=$varis;}  # else for element in @item set the value as the first element in @varis, for the second element (if it's not zero) in @item add the second element and so on  
     $sum = $sum + $item;   # sum all the values 
    } 

    $result = $sums/$sum; 
    print "$result\n"; 

回答

6

你想$varis[$i]其中$i正在處理的@items元素的索引,但是你沒有$i。因此,您需要迭代@items的索引,而不是迭代其元素。

解決方案:

my $sum = 0; 
for my $i (0..$#items) { 
    my $item; 
    if ($items[$i] == 0) { 
     $item = 0; 
    } else { 
     $item = $varis[$i]; 
    } 

    $sum = $sum + $item; 
} 

簡化的解決方案:

my $sum = 0; 
for my $i (0..$#items) { 
    $sum += $varis[$i] if $items[$i]; 
} 
+0

非常感謝您!更長的解決方案工作。我只是從項目中刪除了,並且代碼完美運行。 – LyChn

+0

相反,您應該將's'添加到現有變量中。如果你爲你的收藏使用複數,它最終會減少混淆。 – ikegami

+0

謝謝你的建議!我會改變這一點 – LyChn