在Perl中快速多次搜索和替换

时间:2014-08-29 09:58:21

标签: perl

我有一个文件:map.txt - 有1000多行,如下格式:

aaa { 123 };
bbb { 4567 };
cc { 89 };

我有另一个文件input.txt有5百万+行;
其中包含aaa为"aaa",bbb为"bbb"格式。

我是否可以建议使用perl中最快的方法进行搜索&替换所有出现的:
"aaa" "123"的{​​{1}} 有"bbb"的{​​{1}}等等。

3 个答案:

答案 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});
    }
}