1

我有一个这样的字符串:

*******voltage:156.7;****current:44;****voltage:98;current:0.9;***voltage:45;***

其中*是我们不关心的冗长的垃圾。我们想要做的是产生一个相同的新字符串,但要找到每个“电压”并将其替换为电压 1、电压 2 等,因此每个电压读数都有一个唯一的键名。对于当前(和其他几个)也是如此。

目前尚不清楚在 Perl 中执行此操作的最巧妙方法是什么。它必须能够被熟练的 Perl 程序员和 EE 阅读。终极速度并不重要,我们更愿意坚持使用 Perl 的内置功能,而不是使用一些疯狂的模块。我们这些技术一般的人都没有找到一种方法来做到这一点,而不会使代码变得乱七八糟。

使用正则表达式可能有一个很好的方法,但如果它是一个复杂的仅限大师的正则表达式,没关系!

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

4

2 回答 2

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;****current:44;****voltage2:98;current:0.9;***voltage3:45; ***

于 2012-05-04T03:51:30.953 回答
0

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

#!/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;***
于 2012-05-23T23:41:12.917 回答