我有一个文件:map.txt
- 有1000多行,如下格式:
aaa { 123 };
bbb { 4567 };
cc { 89 };
我有另一个文件input.txt
有5百万+行;
其中包含aaa为"aaa"
,bbb为"bbb"
格式。
我是否可以建议使用perl中最快的方法进行搜索&替换所有出现的:
"aaa"
"123"
的{{1}}
有"bbb"
的{{1}}等等。
答案 0 :(得分:1)
使用哈希。使用旧字符串作为键,将替换字符串用作值。
#!/usr/bin/perl
use warnings;
use strict;
my %map;
open my $MAP, '<', 'map.txt' or die $!;
while (<$MAP>) {
my ($pattern, $replacement) = /(.*) { (.*) };/;
$map{$pattern} = $replacement;
}
open my $IN, '<', 'input.txt' or die $!;
while (<$IN>) {
s/"(.*)"/"$map{$1}"/g;
print;
}
要输出到新文件,请按如下所示更改最后一段:
open my $IN, '<', 'input.txt' or die $!;
open my $OUT, '>', 'output.txt' or die $!;
while (<$IN>) {
s/"(.*?)"/exists $map{$1} ? qq{"$map{$1}"} : qq{"$1"}/ge;
print {$OUT} $_;
}
close $OUT;
答案 1 :(得分:0)
你应该使用特里(https://en.wikipedia.org/wiki/Trie)。
CPAN上有一个模块:http://search.cpan.org/~avif/Tree-Trie-1.5/Trie.pm虽然实现非常简单。
答案 2 :(得分:0)
可能是这样的:
#!/usr/bin/env perl
use strict;
use warnings;
my %hash = (
aaa => '123',
bbb => '4567',
cc => '89',
)
open FILE, '>', 'input.txt';
while(<FILE>)
{
if(/"([a-z]+)"/) {
s/"$1"/'"'.$hash{$1}.'"'/ge if($hash{$1});
}
}