Вы изменили проблему после того, как я дал свой ответ.Это не так важно, потому что ответ не намного сложнее.Вы помните, что видите в #define
с, и используете их позже:
while( <DATA> ) {
if( /^#define\s+(\w+)\s+(\d+)/ ) {
$Len{$1} = $2;
}
elsif( /^char\s/ ){
s/(?<=CHAR\d)\s+//;
s/;$//;
s/(?<=\[)(\w+)(?=])/ $Len{$1} || $1 /e;
print;
}
}
Это довольно тривиальная проблема.Вы уверены, что есть что-то, что вы не говорите нам?Вам не нужно делать что-то необычное.Пропустите все строки, которые вы хотите игнорировать, и исправьте оставшиеся строки в соответствии с вашими потребностями:
while( <DATA> ) {
next unless /^char\s/;
s/(?<=CHAR\d)\s+//;
s/;$//;
print;
}
__DATA__
#define Len1 10;
#define Len2 20;
#define Len3 3;
#define Len4 4;
typedef struct
{
char CHAR1 [Len1];
char CHAR2 [Len2];
} MyBase;
typedef struct
{
MyBase base;
char CHAR3 [Len3];
char CHAR4 [Len4];
} MyStruct;