2017-04-23 25 views
1
字符串长度

我寻找到问题的解决方案:更换&与和带固定在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个子字符串,然后我在第二个中做了所有必要的修改,并且将子字符串连接在一起。

  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; 

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

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

回答

3

可以使用substr呼叫是左值,所以你可以写这样的事情

注意换人s///g返回数字,它已经取得

我已使用for作为专题化器使子字符串可以作为简单变量访问$_

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

N.B. http://perldoc.perl.org/functions/substr.html“在Perl版本5.10之前,多次使用左值的结果是未指定的。” – ysth

+0

@ysth,Unspecified?这是否意味着无证件?如果是这样,谁在乎? – ikegami

+0

@ikegami这意味着无证,而不是任何人想要的。 IIRC,即使长度发生变化,它也会重复使用相同的起始长度,所以如果将长度为4的子字符串改为长度为3的字符串,最终会从字符串中删除字符 – ysth

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