2014-12-20 102 views
0

我想取代我的數組中的元素和我的代碼似乎並沒有工作。替換數組元素使用Perl

my @wholeloop = (split //, $loop);  
     for my $i (0 .. $#wholeloop) { 
      if ($wholeloop[$i] eq "i") { 
      $wholeloop[$i] =~ htmlinsert($offset); 
      $offset++ 
      } 
     } 

我讀過有關通過陣列做,而迭代的東西的問題羣,也許還有更好的解決方案 - >我試圖替換字符串中的字符的具體occurencies,陣列似乎作爲一個合理的工具使用。非常感謝你。

+0

如果你知道字符替換,使用正則表達式可能是可取的。例如。 '$ loop =〜s /([iaeou])/ htmlinsert($ 1)/ ge'。請注意,我不知道代碼中有什麼'$ offset',以及爲什麼使用它。 – TLP

回答

1

通常 - 時在迭代循環,你不需要通過做:

for (0..$#array) { 

因爲

for (@array) { 

將做同樣的事情,但隨着$_一個額外的好處是別名的數組變量。

for my $element (@wholeloop) { 
    if ($element eq "i") { 
     $element = htmlinsert($offset++); 
    } 
} 

$element別名所以如果你改變它,你改變了陣列。 ($_也會這樣做,但我不喜歡使用它,因爲我認爲它代碼不太清晰,這是一種風格/選擇問題,而不是技術問題)。

但是用於搜索和在一個字符串替換元素 - 就像你正在做的 - 那麼你可能會更好過使用其他的事情一個Perl並真的很好 - 正則表達式和模式替換。我不能輕易舉出一個例子,但不知道htmlinsert會返回什麼結果。

喜歡的東西,但:

$loop =~ s/i/newvalue//g; 

將取代「我」的所有實例以「新價值」。

1

=~是Perl的「匹配正則表達式」運算符,因此除非htmlinsert()返回正則表達式,否則可能不是您的意思。您可能想要使用=

更Perlish的方式做到這一點,不過,可能是使用的map功能。 map需要一個塊和一個數組,並使用$_中的數組中的每個元素運行塊,返回該塊返回的所有值。例如:

my @wholeloop = map { 
    $_ eq "i" ? htmlinsert($offset++) : $_; 
} split //, $loop; 

(該?:執行 「的if/else」 在單行;他們是從C. map借從函數式編程語言借來的。)

0

也許你應該使用的foreach。這是最適合你正在嘗試我們在這裏

my @array; 
foreach (@array) { 
    $_ =~ whatever your replacement is; 
} 

做,像Sobrique說,除非htmlinsert返回一個正則表達式的值,即是行不通的。另外,如果您可以爲我們提供「$抵消」背景以及其目的是什麼,那將非常有幫助。