我在执行全局匹配时遇到问题。如何将匹配的字符串替换为新字符串,该字符串由原始字符串和新字符串组成。字符串就像:
$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)
或其他东西使它有一个偏移,但我不知道该怎么做。
答案 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;