【发布时间】:2017-05-09 19:10:23
【问题描述】:
我有多个包含某些代码块、多行的文件,我需要将其注释掉。我对一些包含特定关键字的特殊块感兴趣:
ic 创建
这些块总是以
开头%put %str
结束于
%rcSet
示例块如下:
text
text
text
%put %str(NOTE: integrity constraints);
proc datasets library=TESTING nolist;
modify TESTING_UPDATES;
ic create not null (id);
ic create not null (prsn);
ic create not null (valid_from);
ic create not null (valid_to);
ic create not null (current_flag);
ic create not null (active_flag);
ic create not null (hist);
quit;
%rcSet(&syserr);
%put %str(NOTE: integrity constraints);
proc datasets library=TESTING nolist;
modify TESTING_UPDATES;
quit;
%rcSet(&syserr);
可能有更多块以指定的关键字开始和结束,但没有“ic create”关键字,需要忽略。
我写了一个代码,它可以找到并显示所有这些块,但我不知道
- 我怎样才能得到这些从头到尾中间有所需图案的块
- 最好的注释方式是什么,在行首加*,从头到尾都是这样
- 代码最好不带任何外部模块,因为不是每个未来阅读本文的人都可以访问它们
期望的输出:
text
text
text
* %put %str(NOTE: integrity constraints);
* proc datasets library=TESTING nolist;
* modify TESTING_UPDATES;
* ic create not null (id);
* ic create not null (prsn);
* ic create not null (valid_from);
* ic create not null (valid_to);
* ic create not null (current_flag);
* ic create not null (active_flag);
* ic create not null (hist);
* quit;
*
* %rcSet(&syserr);
%put %str(NOTE: integrity constraints);
proc datasets library=TESTING nolist;
modify TESTING_UPDATES;
quit;
%rcSet(&syserr);
我的 Perl 代码:
use strict;
use warnings;
my @files = glob ("*.sas");
foreach my $file (@files) {
open my $fh, '<', $file or die "Cannot open file: $!"; {
while ( <$fh> ) {
if ( /%put\s%str/ ) {
print;
while ( <$fh> ) {
print;
last if /%rcSet/;
}
print "-" x 20, "\n";
}
}
__END__
非常感谢任何帮助。谢谢!
【问题讨论】:
-
您只想
*IC 线还是包括开头和结尾的整个块?你能显示预期的输出吗? -
用所需的输出更新了我的问题,谢谢。
-
没有必要在 Perl 正则表达式模式中转义百分号
%。 -
没有更多的转义百分号。