2014-12-20 2 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

=~ является оператором регулярного выражения «соответствие регулярному выражению», поэтому, если htmlinsert() не возвращает регулярное выражение, это, вероятно, не то, что вы хотели сделать. Вероятно, вы хотите использовать =.

Более простой способ сделать это, однако, может заключаться в использовании функции map. map принимает блок и массив и запускает блок с каждым элементом массива в $_, возвращая все значения, возвращаемые этим блоком. Например:

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

(? и : выполнять «если/иначе» в одной строке, они заимствованы из С. map заимствовано из функциональных языков программирования.)

0

Возможно, вам следует использовать foreach. Он является наиболее подходящим для того, что вы пытаетесь сделать здесь

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

Теперь, как сказал Sobrique, если htmlinsert не возвращает значение RegEx, что не собирается работать. Кроме того, если бы вы могли дать нам контекст для «$ offset» и какова его цель, это было бы очень полезно.

Смежные вопросы