加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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作为备份).

仅针对示例输入进行测试;不是一个明智的测试套件.
该脚本通过了GLES Prateek Nina测试.

要在目录中的所有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应删除;但是这些脚本无法这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读