java – 仅从For Loops块中删除System.out语句
发布时间:2020-12-15 05:10:31 所属栏目:Java 来源:网络整理
导读:任何方法只能轻松地从文件中的for循环块中删除它们… 之前: for( ... ) {...System.out.println("string");...System.out.println("string");...} 后: for( ... ) {...... ...} 解决方法 这很棘手:哪个关闭括号关闭了for-loop?要么解析整个代码,要么使用
任何方法只能轻松地从文件中的for循环块中删除它们…
之前: for( ... ) { ... System.out.println("string"); ... System.out.println("string"); ... } 后: for( ... ) { ... ... ... } 解决方法
这很棘手:哪个关闭括号关闭了for-loop?要么解析整个代码,要么使用一些启发式.在下面的解决方案中,我要求右括号的意图与for关键字的意图相同:
$perl -nE' if( /^(s*)forb/ .. /^$ws}/ ) { $ws = $1 // $ws; /^s*System.out.println/ or print; } else { print }' 这使用触发器操作符COND1 .. COND2.该脚本可用作简单的过滤器 $perl -nE'...' <source >processed 或备份功能: $perl -i.bak -nE'...' source (创建文件source.bak作为备份). 仅针对示例输入进行测试;不是一个明智的测试套件. 要在目录中的所有Java文件上运行此脚本,请执行此操作 $perl -i.bak -nE'...' *.java 编辑 在Windows系统上,分隔符必须更改为“.此外,我们必须自己进行全局操作. > perl -nE"if(/^(s*)forb/../^$ws}/){$ws=$1//$ws;/^s*System.out.println/ or print}else{print}BEGIN{@ARGV=$#ARGV?@ARGV:glob$ARGV[0]}" *.java 编辑2 这是我在评论中概述的括号计数算法的实现.此解决方案也可以进行备份.命令行参数将被解释为glob表达式. #!/usr/bin/perl use strict; use warnings; clean($_) for map glob($_),@ARGV; sub clean { local @ARGV = @_; local $^I = ".bak"; my $depth = 0; while (<>) { $depth ||= /^s*forb/ ? "0 but true" : 0; my $delta = ( ()= /{/g ) - ( ()= /}/g ); $depth += $delta if $depth && $delta; $depth = 0 if $depth < 0; print unless $depth && /^s*System.out.println/; } return !!1; } 这也不做评论.这只会重新识别启动新行的System.out.println语句. 用法示例:> perl thisScript.pl * .java. 这是一个带有伪java语法的测试文件,我用它进行测试.一旦脚本运行,标记为XXX的所有行都将消失. /** Java test suite **/ bare block { System.out.println(...); // 1 -- let stand } if (true) { for (foo in bar) { System.out.println; // 2 XXX if (x == y) { // plz kill this System.out.println // 3 XXX } // don't exit here System.out.println // 4 XXX } } for (...) { for { // will this be removed? System.out.println // 5 XXX } } /* pathological cases */ // intendation for (...) { System.out.println()/* 6 */} // intendation 2 for (...) { if (x) { System.out.println // 7 XXX }} // inline weirdness for (...) { // "confuse" script here foo = new baz() {void qux () {...} }; System.out.println // 8 XXX } №1应该留下来,并且确实如此.声明№6应删除;但是这些脚本无法这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |