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には、ポインターではなく参照があります。参照を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

于 2012-05-17T12:47:16.970 に答える