使用perl脚本批量移除文件bom

文章描述了一个在Windows环境下开发时,如何使用Perl脚本检测并移除C++源码文件中BOM头的问题,以便于代码移植到Linux。脚本通过遍历指定文件夹中的.h,.hpp,.c,.cpp,.cc文件进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在windows环境下做开发,由于开发者使用的编辑器的不同,可能有部分源码文件带有bom,如果只在Windows环境下开发还好,打算把代码移植到Linux环境就会遇到麻烦。以C++项目为例,这里用perl写一个脚本,遍历文件夹中的所有代码文件,移除bom头部。如果要处理文件夹中的所有文件,或者有其他特定需求,可以自行修改一下正则表达式(代码中有注释标记)。

#! /usr/bin/perl
use v5.14;
use File::Find;
use IO::File;

sub getFileContent {
	my $fileName = shift;
	my $handle = IO::File->new($fileName, 'r');
	$handle->read(my $buffer, -s $handle);
	return $buffer;
}

sub hasBom {
	my $fileName = shift;
	my $content = getFileContent($fileName);
	my $bomData = pack('H*', 'EFBBBF');
	if ($bomData eq substr($content, 0, 3)) {
		return 1;
	} else {
		return 0;
	}
}

sub removeBom {
	my $fileName = shift;
	return unless hasBom($fileName);
	my $content = getFileContent($fileName);
	my $handle = IO::File->new($fileName, 'w');
	$handle->write(substr($content, 3)) if defined $handle;
}

sub addBom {
	my $fileName = shift;
	return if hasBom($fileName);
	my $bomData = pack('H*', 'EFBBBF');
	my $content = getFileContent($fileName);
	my $handle = IO::File->new($fileName, 'w');
	$handle->write($bomData . $content) if defined $handle;
}

my @filesArry = ();
my $callback = sub {
	push @filesArry, $File::Find::name if m{\.(h|hpp|c|cpp|cc)$};
	# 如果要处理文件夹中的所有代码,用下面的语句
	#push @filesArry, $File::Find::name;
};

if (@ARGV) {
	find($callback, $ARGV[0]) if -d $ARGV[0];
} else {
	find($callback, './');
}

for my $filePath (@filesArry) {
	# 测试添加bom
	#addBom($filePath);
	if (hasBom($filePath)) {
		removeBom($filePath);
		say "[REMOVE BOM]: $filePath";
	}
}

脚本可以在Windows环境下的git bash执行或者在ubuntu执行, 默认处理的是当前目录,可以额外给脚本传递一个文件夹路径参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值