String 在长字符串中对一个单词的多次出现进行编号

String 在长字符串中对一个单词的多次出现进行编号,string,perl,substitution,String,Perl,Substitution,我有这样一个字符串: *******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;*** 哪里是我们不关心的长风垃圾。我们要做的是生成一个新的字符串,相同,但要找到每个“电压”,并用voltage1、voltage2等替换它。因此每个电压读数都有一个唯一的键名。同样适用于当前(和其他几个) 目前还不清楚在Perl中实现这一点的最巧妙的方法是什么。它必须能被熟练的Perl程序员和EE阅读。最终的速度并不

我有这样一个字符串:

*******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;***
哪里是我们不关心的长风垃圾。我们要做的是生成一个新的字符串,相同,但要找到每个“电压”,并用voltage1、voltage2等替换它。因此每个电压读数都有一个唯一的键名。同样适用于当前(和其他几个)

目前还不清楚在Perl中实现这一点的最巧妙的方法是什么。它必须能被熟练的Perl程序员和EE阅读。最终的速度并不重要,我们希望坚持使用内置的Perl功能,而不是使用一些疯狂的模块。我们这些技术娴熟的人中没有一个人能够找到一种方法来做到这一点,同时又不会把代码弄得乱七八糟

对于正则表达式,可能有一个很好的方法来实现这一点,但是如果它是一个复杂的、只有上师才能使用的正则表达式,那没关系

如果解决方案可以在古老的Perl版本5.6上运行,则第二个绿色复选标记

#!/usr/bin/env perl

use strict; use warnings;

my $s = q{*******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;***};

my $counter = 0;

$s =~ s/(voltage)/$1 . ++$counter/ge;

print "$s\n";
输出:

*******voltage1:156.7;****current1:44;****voltage2:98;current2:0.9;***voltage3:45;***
*******电压1:156.7****目前:44****电压2:98;电流:0.9***电压3:45;
***

输出:

*******voltage1:156.7;****current1:44;****voltage2:98;current2:0.9;***voltage3:45;***
*******电压1:156.7****目前:44****电压2:98;电流:0.9***电压3:45;

***

这里是对Sinan的答案稍加修改的版本,增加了对“当前”的支持。通过修改正则表达式,可以轻松添加其他标记。每个不同的令牌都有自己的计数器

#!/usr/bin/env perl

use strict; use warnings;

my $s = q{*******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;***};

my %counter;

$s =~ s/\b(voltage|current)\b/$1 . ++$counter{$1}/ge;

print "$s\n";
输出:

*******voltage1:156.7;****current1:44;****voltage2:98;current2:0.9;***voltage3:45;***

下面是对Sinan的答案稍加修改的版本,它增加了对“当前”的支持。通过修改正则表达式,可以轻松添加其他标记。每个不同的令牌都有自己的计数器

#!/usr/bin/env perl

use strict; use warnings;

my $s = q{*******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;***};

my %counter;

$s =~ s/\b(voltage|current)\b/$1 . ++$counter{$1}/ge;

print "$s\n";
输出:

*******voltage1:156.7;****current1:44;****voltage2:98;current2:0.9;***voltage3:45;***

滑溜的虽然我在正则表达式中使用了变量,比如s/foo/$bar/,但我对perl的新印象是,人们可以放入更复杂的表达式中!虽然我在正则表达式中使用了变量,比如s/foo/$bar/,但我对perl的新印象是,可以使用更复杂的表达式。