私は配列へのポインタを持っており、これを機能させるためにコードを大幅に変更する必要があるか、または以下のステートメントの同等物が何であるかを理解する必要があります...
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には、ポインターではなく参照があります。参照を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コードは一度に1つの項目で配列を処理する傾向がありますが、Perlは、たとえば文字列の正規表現を使用したり、配列全体を変換しmap
たりして、概念チャンク全体を変更します。grep