*ptr的C到Perl转换++
我有一个指向数组的指针,或者需要对代码进行大量修改以使其正常工作,或者只是找出下面语句的等价部分*ptr的C到Perl转换++,c,perl,C,Perl,我有一个指向数组的指针,或者需要对代码进行大量修改以使其正常工作,或者只是找出下面语句的等价部分 ptr = array; *ptr++ = value; 到目前为止,我已经掌握了大部分 $ptr = \@array; $$ptr = $value; 但这不会增加指针。我该怎么办?Perl中没有指针。你所拥有的是: my $ary_ref = \@array; $ary_ref现在是对@array的引用。您不能取消引用$ary\u ref以获取标量 但是,您可以通过多种方式迭代@array
ptr = array;
*ptr++ = value;
到目前为止,我已经掌握了大部分
$ptr = \@array;
$$ptr = $value;
但这不会增加指针。我该怎么办?Perl中没有指针。你所拥有的是:
my $ary_ref = \@array;
$ary_ref现在是对@array的引用。您不能取消引用$ary\u 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;
在C中,在Perl中,它可能变成:
$array[$_] = $value for 0 .. $#array;
或者
或者
等等。您应该解释总体目标是什么,而不是询问C中的特定语句。C代码修改数组的第一个元素,并且可能会更改数组其余部分的至少一部分
#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;
}
或者说过于直白
$ perl -wle '@a=(0)x5; $ptr = \$a[0]; $$ptr = 42; print "@a"'
42 0 0 0 0
您的问题给出了C代码的单个簿记细节。更广泛的背景是什么?C代码在做什么
一般来说,不要用Perl编写C。从广义上看,C代码往往一次处理一个数组,但Perl修改整个概念块,例如用字符串的正则表达式或变换整个数组。这是一个初学者问题的邪恶方面。当然,但这是过程的标准。ptr++=数值;同样邪恶。在阅读了C代码之后,我意识到逐行转换的想法非常愚蠢,并使用了一种更简单的非数组/指针/concat方法。我非常喜欢@SinanÜnür的代码片段。肯定会用它来迷惑人们。。。heh@EricFossum最简单的答案也是最没有帮助的。
$_ = value for @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 -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