我有一个指向数组的指针,要么需要大量更改代码以使其工作,要么只需弄清楚下面语句的等价物是什么......
ptr = array;
*ptr++ = value;
到目前为止,我拥有大部分
$ptr = \@array;
$$ptr = $value;
但这不会增加指针。我该怎么办?
Perl 中没有指针。你所拥有的是:
my $ary_ref = \@array;
$ary_ref
现在是对@array
. 您不能取消引用$ary_ref
以获得标量。
但是,您可以通过@array
多种方式迭代 的元素。例如,如果你愿意,你可以这样做:
#!/usr/bin/env perl
use strict; use warnings;
my @array;
my $ptr = sub {
my ($i, $ref, $val, $size) = (0, @_);
sub { $i < $size ? $ref->[$i ++ ] = $val : () }
}->(\@array, deadbeaf => 10);
1 while defined $ptr->();
use YAML;
print Dump \@array;
顺便说一句,你没有理由不写
p[i] = value;
i++;
在 C 中。在 Perl 中,它可能变成:
$array[$_] = $value for 0 .. $#array;
或者,
@array = ($value) x @array;
或者,
$_ = value for @array;
等等。您应该解释总体目标是什么,而不是询问 C 中的特定语句。
C 代码修改了数组的第一个元素,array
并且可能会更改数组其余部分的至少一部分。
#include <stdio.h>
int main(void)
{
int array[] = { 0, 0, 0, 0, 0 };
int value = 42;
int *ptr;
int i;
ptr = array;
*ptr++ = value;
for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
printf("%d ", array[i]);
puts("\n");
return 0;
}
输出:
42 0 0 0 0
Perl 有引用而不是指针。引用不能为空,但没有引用算术。
在 Perl 中修改数组的第一个元素看起来像
$ perl -wle '@a=(0)x5; $a[0] = 42; print "@a"'
42 0 0 0 0
或过于字面意思
$ perl -wle '@a=(0)x5; $ptr = \$a[0]; $$ptr = 42; print "@a"'
42 0 0 0 0
您的问题提供了 C 代码的单个簿记详细信息。更广泛的背景是什么?C代码在做什么?
一般来说,不要在 Perl 中编写 C。从广义上看,C 代码倾向于一次处理一个数组,但 Perl 修改了整个概念块,例如,使用字符串的正则表达式map
或grep
转换整个数组。