我需要编辑一个格式如下的文本文件:
> Word text text text text
Text
Text
> Word text text text text
Text
Text
让它看起来像:
>Word1 text text text text
Text
Text
>Word2 text text text text
Text
Text
基本上,我需要修改字符串的每个实例"字"把它变成" Word"后跟一个数字,该数字对应于字符串到目前为止在文本文件中出现的实例数。我是perl的新手,不知道我在做什么。这就是我所拥有的:
$file = "test.txt";
my %count;
my $word = " Word";
#Open and read data
open (FILE, "<$file") or die "Cannot open $file: $!\n";
@lines= <FILE>;
foreach my $word{
my $count++;
}
close FILE;
my $counter = my $count + 1;
my $curr_ct = my $counter - my $count;
#Open same file for editing now
open (STDOUT, ">$file") or die "Cannot open $file: $!\n";
while (my $count > 0){
s/ Word/Word$curr_ct/
my $count--;
my $curr_ct = my $counter - my $count;
print;
}
close STDOUT;
答案 0 :(得分:5)
没有理由使用(?{ })
。使用/e
时,替换表达式将被评估为每个匹配的Perl代码。这就是你需要的全部。
#!/usr/bin/perl
use strict;
use warnings;
my $word = 'Word';
my $count;
while (<>) {
s/\b\Q$word\E\b/ $word . ++$count /eg;
print;
}
5.10引入\K
,这可以使关键线更短!
s/\b\Q$word\E\b\K/ ++$count /eg;
其他改进:
\b
使其sword
或wordy
不匹配。\Q
.. \E
使$word
可以安全地包含非单词字符。答案 1 :(得分:-1)
您可以在正则表达式中使用零宽度code evaluation expression断言,例如:(?{...})
来增加每个匹配的计数值,然后在替换端使用该计数:
请注意,根据文档,代码评估表达式被认为是实验性的。
use warnings;
use strict;
my $word = 'Word';
my $file = 'file.txt';
open my $fh, '<', $file or die $!;
my $count;
while (<$fh>){
s/$word(?{$count++})/$word$count/g;
print;
}
输入:
> Word text text text text
Text
Text
> Word text text text text
Text
Text
输出:
> Word1 text text text text
Text
Text
> Word2 text text text text
Text
Text