我有两个文件。第一个包含频繁 单词序列 从文本文件中提取
big pizza
eat big pizza
...
文本文件是
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;
答案 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;
}
然后你的程序会更好一点