我正在尝试替换数组中的元素,但我的代码似乎无法正常工作。
my @wholeloop = (split //, $loop);
for my $i (0 .. $#wholeloop ) {
if ( $wholeloop[$i] eq "i" ) {
$wholeloop[$i] =~ htmlinsert($offset);
$offset++
}
}
我已经阅读了在迭代数组时做事情的问题,也许有更好的解决方案。我正在尝试替换字符串中字符的特定出现,并且数组似乎是一种合理的工具。
答案 0 :(得分:2)
通常情况下 - 在循环迭代时,您不需要通过以下方式执行此操作:
for ( 0..$#array) {
因为
for ( @array ) {
将执行相同的操作,但具有$_
作为数组变量别名的附加优势。
for my $element ( @wholeloop ) {
if ( $element eq "i" ) {
$element = htmlinsert($offset++);
}
}
$element
是别名,因此如果您更改它,则更改数组。 ($_
也会这样做,但我不喜欢使用它,因为我觉得代码不太清楚。这是一种风格/选择问题,而不是技术问题)。
然而,对于搜索和替换字符串中的元素 - 就像你正在做的那样 - 那么你最好还是使用perl做的其他事情之一 - 正则表达式和模式替换。我不能轻易举出一个例子,却不知道htmlinsert
返回什么。
尽管如此:
$loop =~ s/i/newvalue//g;
将替换所有' i'有了新的价值'。
答案 1 :(得分:1)
=~
是Perl的“匹配正则表达式”运算符,所以除非htmlinsert()
返回正则表达式,否则它可能不是你想要做的。您可能想要使用=
。
更多的Perlish方法可能是使用map
函数。 map
接受一个块和一个数组,并使用$_
中数组的每个元素运行该块,返回该块返回的所有值。例如:
my @wholeloop = map {
$_ eq "i" ? htmlinsert($offset++) : $_;
} split //, $loop;
(?
和:
在一行中执行“if / else”;它们是从C语言借用的。map
是从函数式编程语言中借用的。)
答案 2 :(得分:1)
也许你应该使用foreach。它最适合你在这里尝试做的事情
my @array;
foreach ( @array ) {
$_ =~ whatever your replacement is;
}
现在,就像Sobrique所说的那样,除非htmlinsert返回一个RegEx值,否则无法正常工作。另外,如果你能给我们“$ offset”的上下文,以及它的目的是什么,那将非常有帮助。