如何解决如何根据 Perl 中的匹配括号删除文件的一部分
我是 Perl 的新手,曾尝试使用正则表达式根据匹配的大括号删除文件的一部分,但收效甚微。我想减小文件大小。以下是我要修改的文件的简化版本(原始文件约为 1GB):
# file.pm
package myPackage
%My::Hash = (
'foo1' => {
'foo2' => {
'bar' => {
'Text to be deleted'
}
}
}
)
我想删除出现“bar”一词的行、“bar”对应的大括号以及匹配大括号之间的文本。我非常感谢任何人就如何解决这个问题提供意见。
编辑:谢谢大家。我相信我想出了一个解决方案。我应该添加更多上下文。原始(以上)代码来自 pm 文件。我正在编写一个单独的脚本来删除这个 pm 文件的一个子部分。
所以我写的脚本是:
# myScript.pl
use strict;
use warnings;
use myPackage
$ |=1;
my $output = 'file.pm';
open(OUTPUT,'>'.$output)
my %hash = Dumper %My::Hash;
# logic to remove key
print OUTPUT %hash
我目前遇到的问题是转储散列的格式。由于制表符空间较大,新文件的大小明显大于原始文件。
第二次编辑:我决定创建一个括号平衡算法,因为它对于编辑这个文件要简单得多。
解决方法
如果您信任创建该文件的软件/人员,您可以将其评估为哈希值,删除密钥,然后使用 Data::Dumper 保存新文件。
,请研究以下代码片段以符合您的问题。
代码用一些空格字符替换新行之后的所有内容,然后用 'bar' => { anything not closing bracket }
替换。
use strict;
use warnings;
use feature 'say';
my $data = do { local $/; <DATA> };
$data =~ s/\n\s+'bar' => \{[^}]+\}//s;
say $data;
__DATA__
%My::Hash = (
'foo1' => {
'foo2' => {
'bar' => {
'Text to be deleted'
}
}
}
)
输出
%My::Hash = (
'foo1' => {
'foo2' => {
}
}
)
参考: regex, regex quickregex tutorial
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。