我有这个脚本,它基于相同的部分组合了两个文本。有什么办法来加速这个Perl脚本?
use warnings;
use strict;
use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");
my $f1 = 'input.txt';
my $f2 = 'add.txt';
my $f3 = 'output.txt';
my %ids;
my $fh;
open $fh, '<', $f2 or die "Can't read the file with replacements: $!";
while (<$fh>) {
chomp;
my ($name, $id) = split /=/;
$ids{$name} = $id;
}
close $fh;
open my $fho, '>', $f3 or die "Can't write output file: $!";
open $fh, '<', $f1 or die "Can't read input file: $!";
while (<$fh>) {
for my $name (keys %ids) {
s/$name/${name} $ids{$name}/;
}
print $fho $_;
}
close $fh;
close $fho;
例如,
input.txt中 - “文本流” 没有特别的结构
random text random text, TARGET TEXT 1 — random
textTARGET TEXT 2! random text random text
random text random text random text
TARGET TEXT 3 random text random text TARGET TEXT 4 random text
add.txt - 文本的方式来加入
TARGET TEXT 1=ADDITIONAL TEXT 1
TARGET TEXT 2=ADDITIONAL TEXT 2
TARGET TEXT 3=ADDITIONAL TEXT 3
TARGET TEXT 4=ADDITIONAL TEXT 4
output.txt的将是:
random text random text, TARGET TEXT 1 ADDITIONAL TEXT 1 — random
textTARGET TEXT 2 ADDITIONAL TEXT 2! random text random text
random text random text random text
TARGET TEXT 3 ADDITIONAL TEXT 3 random text random text TARGET TEXT 4 ADDITIONAL TEXT 4
我有一个相当大的文本文件结合(〜40Mb)和脚本做它的工作超级慢。有什么方法可以加速吗?或者,也许有人知道一个可以做同样事情的工具。
如果您知道每行只能进行一次替换,您可以从'for for'循环中'结束'。 – toolic
你可以将所有的目标字符串合并为一个正则表达式,然后是/// ge'吗? – toolic
@toolic,不幸的是,有三个匹配中的两个很多行。我刚更新了这个例子。目标文本匹配也完全不同。 – Systematis