2017-07-05 3 views
0

グローバルマッチを行う場合に問題があります。一致した文字列を元の文字列と新しい文字列で構成された新しい文字列に置き換えるにはどうすればよいですか?今Perl、グローバルマッチ、マッチした文字列の後に何かを追加する

$newstring = "t123 fruit1:apple;t456 fruit2:pear;t789 fruit3:banana"; 

、私のPerlコード:私は、その後のような新しい文字列を取得するにはどうすればよい

my %hash = (
    t123 => 'fruit1', 
    t456 => 'fruit2', 
    t789 => 'fruit3', 
); 

:私はこのようなハッシュを持って次に

$string = "t123:apple;t456:pear;t789:banana"; 

:のような文字列がありますは:

while($string =~ /t\d{3}/g){ 
    if (exists $hash{"$&"}) { 
     my $match = $&; 
     $string =~ s/$&/$match.$hash{"$&"}/; 
    } 
} 

マッチは常に最初の文字から始まるからです。私はpos(string)か何かにオフセットを持たせるべきだと思いますが、どうやってこれを行うのか分かりません。

答えて

4

簡単な方法はかなり簡単です:

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

my $string = "t123:apple;t456:pear;t789:banana"; 

my %hash = (
    t123 => 'fruit1', 
    t456 => 'fruit2', 
    t789 => 'fruit3', 
); 

$string =~ s/(t\d+)/$1 $hash{$1}/g; 

say $string; 

しかし、これはt\d{3}に一致するすべてはあなたのハッシュで有効なキーであることを保証しません。では、明示的にそれらのキーを検索しましょう。

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

my $string = "t123:apple;t456:pear;t789:banana"; 

my %hash = (
    t123 => 'fruit1', 
    t456 => 'fruit2', 
    t789 => 'fruit3', 
); 

my $match = join '|', map quotemeta, keys %hash; 

$string =~ s/($match)/$1 $hash{$1}/g; 

say $string; 
+0

'それを作るために良いでしょう(<[^;]?!)?($マッチ)(= :)' – ysth

+0

ああ、あなたは正しい、ということ逃しました – ysth

関連する問題