我不知道你为什么要去掉 ifdefs,你可能可以使用 C 预处理器来做到这一点,但这是你在 Perl 中的做法,因为这意味着我可以使用触发器运算符.
首先是制作一个足够的正则表达式来匹配 ifdef。IIRC 它们可以缩进,#
并且单词和单词之间可以缩进。
#ifdef
# ifdef
#ifdef
不确定最后一个是否有效,但无论如何我都会接受它。
my $ifdef_re = qr{^\s*#\s*ifdef\b};
my $endif_re = qr{^\s*#\s*endif\b};
如果只是删除 and 之间的文本#ifdef
,#endif
Perl 有很少使用的触发器标量..
运算符。
#!/usr/bin/env perl
use strict;
use warnings;
my $ifdef_re = qr{^\s*#\s*ifdef\b};
my $endif_re = qr{^\s*#\s*endif\b};
while(<DATA>) {
my $in_ifdef = /$ifdef_re/ .. /$endif_re/;
print if !$in_ifdef;
}
__DATA__
int i;
NSString *someString;
#ifdef EXAMPLE
NSString *exampleString;
#endif
bool done;
但是由于我们需要担心嵌套的 ifdef,它是不够的。深度计数器可以解决这个问题。
#!/usr/bin/env perl
use strict;
use warnings;
my $ifdef_re = qr{^\s*#\s*ifdef\b};
my $endif_re = qr{^\s*#\s*endif\b};
my $ifdef_count = 0;
while(<DATA>) {
$ifdef_count++ if /$ifdef_re/;
print if $ifdef_count <= 0;
$ifdef_count-- if /$endif_re/;
}
__DATA__
int i;
NSString *someString;
#ifdef EXAMPLE
NSString *exampleString;
# ifdef FOO
this should not appear
# endif
nor should this
#endif
bool done;