我有一个我从文件中读取的语句列表,其中每个语句可能包含一些文本。
#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";
}
}
有人能帮帮我吗?这也不是最有效的方式,但我现在对性能并不太担心。但是,如果有更好的方法来解决这个问题,我会全力以赴。
答案 0 :(得分:1)
您只需要$expr =~ s/\b$key\b/$value/g
。此时无需执行eval
。