0

给定文本是“C”样式结构 -

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

逐行阅读文本并评估每个数组中的元素数量,并使用元素计数重新声明数组。

结果应打印如下:-

    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

双重评估是必要的,因为第一次评估将变量转换为字符串,然后评估字符串。

虽然你会遇到麻烦10^2,就像^二进制 XOR 运算符一样,而不是指数运算符**

于 2013-02-06T10:21:43.653 回答
0

试试这个方法:$line =~ s/.*?\[(.*?)\]/$1/ge

于 2013-02-06T10:07:56.017 回答
0

用于quotemeta清理替换字符串:

if ( $line =~ m/.*?\[(.*?)\]/ ) {
    my $expr = quotemeta($1);
    my $answer = eval ($1);
    $line =~ s/$expr/$answer/;
}
于 2013-02-06T15:47:48.113 回答
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 回答