1

次のような文字列があります。

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

ここで、*は私たちが気にしない長ったらしいがらくたです。私たちがやりたいことは、同じである新しい文字列を生成することですが、すべての「電圧」を見つけて、それを電圧1、電圧2などに置き換えて、各電圧の読み取り値が一意のキー名を持つようにします。同様に、現在(および他のいくつか)についても同様です。

Perl でこれを行う最も巧妙な方法は明らかではありません。中程度のスキルを持つ Perl プログラマーおよび EE が読めるものでなければなりません。究極の速度は重要ではありません。クレイジーなモジュールを使用するのではなく、組み込みの Perl 機能に固執したいと考えています。中程度のスキルを持つ私たちの誰も、機能しないコードを混乱させずにこれを行う方法を見つけていません。

おそらく正規表現でこれを行う良い方法がありますが、それが複雑なグルのみの正規表現である場合は、気にしないでください!

ソリューションが古代の Perl バージョン 5.6 で実行できる場合は、2 つ目の緑色のチェックマーク

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

これは、「現在」のサポートを追加する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;***
于 2012-05-23T23:41:12.917 に答える