Perl,全局匹配并在匹配的字符串后附加一些东西

时间:2017-07-05 14:50:53

标签: regex perl match substitution

我在执行全局匹配时遇到问题。如何将匹配的字符串替换为新字符串,该字符串由原始字符串和新字符串组成。字符串就像:

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

然后我有这样的哈希:

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

如何获取新字符串,例如:

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

现在,我的perl代码是:

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

虽然它不起作用,因为匹配总是从第一个字符开始。我想我应该使用pos(string)或其他东西使它有一个偏移,但我不知道该怎么做。

1 个答案:

答案 0 :(得分: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',
);

$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;