Perl,为什么输出中会有多余的空白

时间:2018-11-11 02:38:44

标签: perl

输入: enter image description here

输出: enter image description here

但是我的输出在最后两行上有一个多余的空格。 我的输出: enter image description here

我的代码:

@content = <FILE>; 

foreach $line (@content){ 
    if($line =~ /^#(\d+)/){ 
        $number = $1; 
        $line =~ s/^#(\d+)/$content[$number-1]/; 
    }
    print "$line"; 
} 

1 个答案:

答案 0 :(得分:2)

这是带有示例输入数据的代码版本。如果您希望人们在此类问题上为您提供帮助,那么使他们尽可能地容易是一个好主意。发布输入数据的图像并不容易。另外,将示例数据存储在DATA文件句柄中是一个很好的开发技巧,以使代码和数据一起位于同一文件中。

#!/usr/bin/perl

use strict;
use warnings;

my @content = <DATA>;

foreach my $line (@content){
    if($line =~ /^#(\d+)/){
        my $number = $1;
        $line =~ s/^#(\d+)/$content[$number-1]/;
    }
    print "$line";
}

__DATA__
line A
line B
line C
#7
line D
#2
line E

我还为您的代码添加了use strictuse warnings。在这种情况下,它们并没有真正的帮助,但是您应该养成始终将它们包含在Perl程序中的习惯。

您的问题在这里:

$line =~ s/^#(\d+)/$content[$number-1]/;

@content数组中的每一行末尾都将包含换行符。但是在这一行中,您要用阵列中的另一行替换#符号和后面的数字。您不是要替换原始换行符,而是要添加另一个换行符(来自替换字符串),因此该行最终包含两个换行符。

最简单的解决方法是将换行符添加到您要匹配的模式中。

$line =~ s/^#(\d+)\n/$content[$number-1]/;

请注意,经验丰富的Perl程序员会这样编写您的代码:

#!/usr/bin/perl

use strict;
use warnings;

my @content = <DATA>;

for (@content){
    s/^#(\d+)\n/$content[$1 - 1]/;
    print;
}