替换&与&在Perl中保留字符串长度

时间:2017-04-23 16:30:26

标签: regex string perl

我正在寻找问题的解决方案:

我有一个固定长度的字符串,如下所示:

 99               9999999999999                               999999ZK9999.999999999999.999999999 (9999999)                       Text & to change                    something random here                   

我想用&替换任何&符号,但仅当此符号位于左侧130和170个字符之间时。 我还想在子字符串的末尾添加必要的空格,因此长度保持不变:

 99               9999999999999                               999999ZK9999.999999999999.999999999 (9999999)                       Text & to change                        something random here                   

可能有多个&要替换。

目前我正在创建3个子串,然后我在第2个中进行了所有必要的更改,并且我将子串连接在一起。

            my $subline1 = substr $line, 0, 130;
            my $subline2 = substr $line, 130, 40;
            my $subline3 = substr $line, 170;
            if ($subline2 =~ s/(&)/&/ig) {
                while (length($subline2)<40){
                    $subline2=$subline2." ";
                }
                $line=$subline1.$subline2.$subline3;

有没有更好的方法来实现这一目标?

编辑:添加了我当前的解决方案

2 个答案:

答案 0 :(得分:3)

您可以将substr调用用作左值,这样就可以编写类似这样的内容

请注意s///g会返回已完成的替换次数

我已将for用作 topicaliser ,以便将子字符串作为简单变量$_

进行访问
for ( substr $s, 130, 40 ) {
    my $n = s/&amp;/&/g;
    $_ .= ' ' x ( 4 * $n );
}

答案 1 :(得分:0)

use HTML::Entities qw( decode_entities );

substr($s, 130, 40, sprintf('%-40s', decode_entities(substr($s, 130, 40))));

use HTML::Entities qw( decode_entities );

my $format = 'A130 A40 A*';
my @fields = unpack($format, $s);
$fields[1] = decode_entities($fields[1]);
$s = pack($format, @fields);