输入: 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";
}
答案 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 strict
和use 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;
}