我有一个指向数组的指针,要么需要更改代码才能使其正常工作,或者只是弄清楚下面的语句的等效性是什么......
ptr = array;
*ptr++ = value;
到目前为止,我已经掌握了大部分内容
$ptr = \@array;
$$ptr = $value;
但这不会增加指针。我该怎么办?
答案 0 :(得分:8)
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中的特定陈述。
答案 1 :(得分:2)
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有引用而不是指针。引用不能为null,但没有引用算法。
在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
来转换整个数组。