项目中单行代码太长是不便于阅读和维护的,这里用perl单行命令实现项目中的单行过长的代码信息统计,方便修改。为方便说明,这里以一个开源项目为例,github链接evpp。以commit id 477033f938fd47dfecde43c82257cd286d9fa38e 为例,git checkout -b test 477033f938fd47dfecde43c82257cd286d9fa38e 切一个分支测试。这里统计后缀为 (h|cpp|cc) 的代码,假定要统计单行长度超过170的代码所在的文件名和行数索引。下面给出命令:
find . -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.cc' \) | xargs -i perl -lne '$len=length;print qq($ARGV:$. => length=$len) if $len > 170' {}
运行效果截图如下:
这里的输出中依次是文件名、行数索引、代码长度。也可以不用单行命令的形式,下面给出另外一种纯perl脚本的实现:
#! /usr/bin/perl
use v5.14;
use File::Find;
use IO::File;
my $max_len = 170; # 代码单行最大长度
my @filesArry = ();
my $callback = sub {
# 根据需要自行修改正则
push @filesArry, $File::Find::name if m{\.(h|cpp|cc)$};
};
find($callback, "./");
for my $filePath (@filesArry) {
my $handle = IO::File->new($filePath, 'r');
unless (defined $handle) {
warn "$filePath: open failed !!!";
next;
}
chomp(my @arry = <$handle>);
for (my $index = 0; $index < @arry; ++$index) {
my $line = $arry[$index];
my $len = length($line);
next if $len <= $max_len;
my $lineIndex = $index + 1;
say "[$filePath:$lineIndex], length=$len";
}
}
运行效果如下:
和单行命令的输出结果是一样的,输出顺序略有差异。