我有如下两个文件。
- 地址文件[查找文件]
POST OFFICE,PO SUITE ACCESS ROOM, SAR SUITE,STE STREET,ST NEW YORK,NY POST,PST LONG LINE STREET,LLS
- 主文件[需要搜索和替换精确字符串的地方]
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";
}
最佳答案
您的问题出在 my @line = split;
,它将行拆分为单词。由于您的一些替换包含多个单词,因此您不能这样做。
相反,您应该构建一个匹配所有键的正则表达式,例如:
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
的行上执行替换。
关于string - 使用 PERL 脚本精确匹配和替换文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474668/