C转换为* ptr ++的Perl

时间:2012-05-16 23:33:26

标签: c perl

我有一个指向数组的指针,要么需要更改代码才能使其正常工作,或者只是弄清楚下面的语句的等效性是什么......

ptr = array;
*ptr++ = value;

到目前为止,我已经掌握了大部分内容

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

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

2 个答案:

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