0

与えられたテキストは 'C' スタイルの構造です -

    struct mystruct {
        int a[100];
        int b[10*10];
        int c[10*5+(25*2)];
        int d[10^2];
    }

テキストを 1 行ずつ読み、各配列の要素数を評価し、要素数で配列を再宣言します。

結果は次のように出力する必要があります:-

    struct mystruct {
        int a[100];
        int b[100];
        int c[100];
        int d[100];
    }

次の文字列置換は私にとってはうまくいきません -

    if ($line =~ m/.*?\[(.*?)\]/) {
        $answer = eval ($1);
        $line =~ s/$1/$answer/g;
    }

置換は機能せず、評価されたすべての要素数に対して $line は変更されませんでした。

4

4 に答える 4

5

代用で直接評価を行います。

$line =~ s/(?<=\[)   # assert a square bracket behind
           ([^]]*)   # capture string of non-brackets
           (?=\])    # assert square bracket after
          /$1/eex;   # double evaluate the variable

最初の評価で変数が文字列に変換され、次に文字列が評価されるため、二重評価が必要です。

で問題が発生しますが、べき乗演算子ではなく、バイナリXOR演算子も10^2同様です。^**

于 2013-02-06T10:21:43.653 に答える
0

ミゲルが正しいようです:

my $string =
q|int a[100];
int b[10*10];
int c[10*5+(25*2)];
int d[10^2];|;

foreach my $line (split(/\n/,$string)) {
        if ($line =~ m/\[([^\]]+)\]/) {
                my $equation = $1;
                my $val = eval($equation);
                # escape out the special characters.
                $equation =~ s/\*/\\\*/g;
                $equation =~ s/\,/\\\,/g;
                $equation =~ s/\+/\\\+/g;
                $equation =~ s/\)/\\\)/g;
                $equation =~ s/\(/\\\(/g;
                $equation =~ s/\^/\\\^/g;

                $line =~ s/\[$equation\]/\[$val\]/;
        }
        print "$line\n";
}

これは以下を返します:

int a[100];
int b[100];
int c[100];
int d[8];

したがって、「power of」の特殊文字も変更する必要があることがわかります。しかし、これはあなたを正しい方向に向けていると思います。

于 2013-02-06T14:49:52.347 に答える
0

この方法を試してください:$line =~ s/.*?\[(.*?)\]/$1/ge

于 2013-02-06T10:07:56.017 に答える