0

我正在尝试替换 Perl 文件中的一组特定字符,但它似乎不起作用,这是我的代码。

my $file = shift;
open(FILE, "$file") or die "File not found";
while (<FILE>){
   $data .=$_
}
$data =~ s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;

我知道我的模式匹配适用于查找字符集,我不完全确定替换是否有效。然而,我主要关心的是 Perl 代码。该文件在我运行后保持不变。

示例文件。

AB123456C Ab12345678 DG657465 GH123456FG
4

2 回答 2

2

代码不会更改文件,因为您没有告诉它这样做。您打开文件是为了读取,而不是写入,而且您不打印任何内容。

如果您想快速处理此问题,只需将您的正则表达式替换放在一个文件中并将其用作源文件。像这样:

regex.pl 的内容:

s/[^A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}\s?[0-9]{2}\s?[0-9]{2}\s[0-9]{2}\s?[A-DEM]{0,1}$/XX012345X/g;

单线:

perl -p regex.pl inputfile.txt > output.txt

这样您就可以快速检查输出。您也可以通过管道传送到寻呼机命令或根本不传送。

于 2013-01-29T11:00:53.673 回答
0

您正在打开的文件是只读的。因此,您需要打开一个临时的第二个文件(File::Temp),在其中写入 $data 变量,关闭它,删除第一个文件(unlink并将临时文件重命名为所需的名称。

这个SO question可能会有所帮助。

题外话:请使用现代 Perl 方法来处理您的文件。例如:

open my $fh, "<", $filename or die "Cannot open file $filename"

另请参阅此SO 问题。避免使用包全局类型glob 文件句柄。

于 2013-01-29T10:59:34.243 回答