0

我有一个指向数组的指针,要么需要大量更改代码以使其工作,要么只需弄清楚下面语句的等价物是什么......

ptr = array;
*ptr++ = value;

到目前为止,我拥有大部分

$ptr = \@array;
$$ptr = $value;

但这不会增加指针。我该怎么办?

4

2 回答 2

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 中的特定语句。

于 2012-05-16T23:35:49.530 回答
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 有引用而不是指针。引用不能为空,但没有引用算术。

在 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 修改了整个概念块,例如,使用字符串的正则表达式mapgrep转换整个数组。

于 2012-05-17T12:47:16.970 回答