我正在寻找问题的解决方案:
我有一个固定长度的字符串,如下所示:
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;
有没有更好的方法来实现这一目标?
编辑:添加了我当前的解决方案
答案 0 :(得分:3)
您可以将substr
调用用作左值,这样就可以编写类似这样的内容
请注意s///g
会返回已完成的替换次数
我已将for
用作 topicaliser ,以便将子字符串作为简单变量$_
for ( substr $s, 130, 40 ) {
my $n = s/&/&/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);