2013-10-20 46 views
0

我有兩個文件,如下所示。使用PERL腳本精確字符串匹配和替換文件

  1. 地址文件[查找文件]
POST OFFICE,PO 
SUITE ACCESS ROOM, SAR 
SUITE,STE 
STREET,ST 
NEW YORK,NY 
POST,PST 
LONG LINE STREET,LLS 
  1. 主文件[如果需要搜索和替換字符串精確]
ARIJIT, 192 POST OFFICE, SUITE 
CHANDA, 13 HP STREET, NY 
RAM, POSTING POST, LONG LINE STREET 
ROY, POST 3009, SUITE ACCESS ROOM 

預期輸出:

ARIJIT, 192 PO, STE 
CHANDA, 13 HP ST, NEW YORK 
RAM, POSTING PST, LLS 
ROY, PST 3009, SAR 

我使用下面的代碼,但仍然沒能得到任何成功。我在PERL很新。該代碼對於單個WORD工作正常,但不適用於多個單詞。

#!/usr/bin/perl 
use warnings; 
use strict; 
open(my $out_fh, ">", "output.txt") || die "Can't open the output file for writing: $!"; 

open(my $address_fh, "<", "Address.txt") || die "Can't open the address file: $!"; 
my %lookup = map { chomp; split(/,/, $_, 2) } <$address_fh>; 

open(my $file_fh, "<", $ARGV[0]) || die "Can't open the file.txt file: $!"; 
while (<$file_fh>) { 
    my @line = split; 
    for my $char (@line) { 
     (exists $lookup{$char}) ? print $out_fh "$lookup{$char} " : print $out_fh "$char "; 
    } 
    print $out_fh "\n"; 
} 

回答

4

你的問題是my @line = split;,其將行成。由於你的一些替代品包含多個詞,你不能這樣做。

相反,你應該建立一個所有你的鑰匙相匹配的正則表達式,e.g:

my $keywords = join '|', map quotemeta, sort { length($b) <=> length($a) } keys %lookup; 
my $keywords_rx = qr/\b$keywords\b/; 

\b斷言,在字的邊界匹配。我們還必須對鍵進行排序,以便在之前嘗試更長的替代品較短的匹配項。否則,SUITE ACCESS ROOM可能永遠不會匹配。

然後在s/($keywords_rx)/$lookup{$1}/g這樣的行上執行替換。

+0

它的工作就像一個魅力!謝謝.. –