perl从字符串中提取数字,编辑,在其原始位置放回字符串

时间:2016-04-13 14:06:36

标签: string perl

我正在尝试编辑字符串中的数字并将其放回原处所在的位置。

示例:

$string = "struct:{thin:[[75518103,75518217],[75518338,75518363],[75532810,75533910],],thick:[[75518363,75518424],[75521257,75521463],],}";

我需要编辑数字,但是要保留字符串的其余部分。另外,括号的数量可以变化。

到目前为止,我将字符串拆分为“,” @array = split (',',$string);  并使用

提取要编辑的数字
foreach (@array) { 
            $_ =~ s/\D//g;
            $_ = $number - $_;
}

现在我想将数字放回字符串中的原始位置,但我不知道如何。 不知何故,我希望有一种更好的方法来编辑字符串中的数字而不分割它并提取数字。希望你能帮帮我

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式替换with the /e flag,搜索长数字并在替换部分中运行Perl代码。

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

my $number = 100_000_000;
my $string = "struct:{thin:[[75518103,75518217],[75518338,75518363],[75532810,75533910],],thick:[[75518363,75518424],[75521257,75521463],],}";

$string =~ s/(\d+)/{$number - $1}/eg;

say $string;

__END__

struct:{thin:[[24481897,24481783],[24481662,24481637],[24467190,24466090],],thick:[[24481637,24481576],[24478743,24478537],],}

如果字符串中没有其他数字,那就行了。如果涉及更多逻辑,您也可以将其移动到子例程中,并在替换中调用它。

sub replace {
    return $_ % 2 ? $_ * 2 : $_ / 4;
}

$string =~ s/(\d+)/{replace($1)}/eg; 

您可能还需要修改搜索模式以使其更精确。

答案 1 :(得分:1)

我刚刚找到正则表达式的评估修饰符!我现在用

做了
$string =~ s/([0-9]+)/$number-$1/eg;

它有效!