替换数学语句中的文本,然后进行评估

时间:2014-09-15 23:13:38

标签: regex perl replace hashtable

我有一个我从文件中读取的语句列表,其中每个语句可能包含一些文本。

#define macro_name            macro_value // any comments

以下是一些示例数据:

#define CER_PER_REGION        0x0080  // <128> Max CER per DM region
#define TER_PER_BER_REGION    256
#define NO_OF_BER_REGIONS     16
#define ASYMP_LIMIT           0x1200
#define TER_MAX               (TER_PER_BER_REGION * NO_OF_BER_REGIONS)  // TER region where the data pitch is constant
#define TER_FORMAT            ((NO_OF_TER_REGIONS-1)*CER_PER_REGION)+2)  // Regions go across all the CER surfaces

#define SCL_DVT1_CODE_SIZE    (SCL_DVT1_SIZE - SCL_DVT1_TBL_SIZE - SCL_DVT1_DATA_SIZE)    //* these macros are defined in another file, assume they've already been hashed
#define MEMORY_BUDGET_SCREEN  (1   * ((SCREEN_TARGET_SECTOR_SIZE / HOST_SIZE) * MB_SIZE)) //* these macros are defined in another file, assume they've already been hashed

我已经成功地编写了一个正则表达式,用于区分&#39; #define&#39;,&#39; macro_name&#39;和&#39; macro_value&#39;分为三个变量。我的问题在于替换第三个变量macro_value的右侧(RHS)内的文本,其中文本在哈希表中存储了一些值{&#39; macro_value&#39; =&GT; actual_value}。

最终目标是在替换所有文本后在RHS上运行eval。例如,TER_MAX在替换后看起来像(256 * 16),因此我会将其作为{"TER_MAX" => 4096}存储在我的哈希值中。

我的一个想法是迭代哈希表中的键并执行s/$key/$value/,但它似乎没有做任何事情。

sub parseRHS{
   my $expr = shift;
   my %hash = @_;

    while ( my($key, $value) = each %hash){
        print "Old: ".$expr."\n";
        eval "\$expr =~ s/.*{$key}.*/.*{$value}.*/";
        print "New: ".$expr."\n";
        print "\n";
    }

}

有人能帮帮我吗?这也不是最有效的方式,但我现在对性能并不太担心。但是,如果有更好的方法来解决这个问题,我会全力以赴。

1 个答案:

答案 0 :(得分:1)

您只需要$expr =~ s/\b$key\b/$value/g。此时无需执行eval