在文本文件中附加频繁的单词

时间:2017-05-06 11:33:45

标签: perl

我有两个文件。第一个包含频繁 单词序列 从文本文件中提取

a.txt:

big pizza
eat big pizza 
...

文本文件是

b.txt:

i eat big pizza .my big pizza ...

我的问题是在文件bbb中存在的每个序列的单词之间添加a.txt并写入新文件。 所以结果将是

i eatbbbbigbbbpizza.my bigbbbpizza...

下面是我的脚本。它仅在9f个单词之间添加bbb。我怎么能纠正这个?

use strict;
use warnings;
use autodie;

my ($f1, $f2) = ('a.txt', 'b.txt');

open( my $fh, $f1 );

my @seq;

foreach ( <$fh> ) {
  chomp; 
  s/^\s+|\s+$//g; 
  push @seq, $_;      
}
close $fh;

open($fh, $f2);

foreach (<$fh> ) {
    foreach my $r (@seq) {   
        my $t = $r =~ s/ /bbb/r; 
        if (/$r/) {
            s/$r/$t/g;
        }
    }
    print ;
}
close $fh;

1 个答案:

答案 0 :(得分:1)

所有错误的是你的行

my $t = $r =~ s/ /bbb/r; 

此替换只运行一次,因此仅用bbb替换第一个空格

您需要使用全局替换。虽然我们正在更改此行,但最好还用\h+替换空格,my $t = $r =~ s/\h+/bbb/gr; 匹配任意数量的&#34;水平空格&#34;,包括标签和空格

@seq

如果它们出现在您的代码中,如果它们出现在数组的前面,则会找到并替换big pizza中其他条目的子字符串。在这种情况下,这意味着首先会找到bigbbbpizza,然后转换为eat big pizza 无法再找到@seq = sort { length($b) <=> length($a) } @seq; 。您需要先按照长度的降序对数组进行排序,以便在较短的短语之前找到较长的短语

ul {
  counter-reset: test;
  list-style: none;
}

li::before {
  counter-increment: test;
  content: counter(test) '.';
  display: inline-block;
  margin-right: 15px;
  width: 20px;
  text-align: right;
}

然后你的程序会更好一点