Вот версия вашего кода с примерами входных данных. Если вы хотите, чтобы люди помогали вам с подобными проблемами, то это хорошая идея, чтобы сделать это как можно проще для них. Размещение изображений ваших входных данных не облегчает. Кроме того, это хороший прием для хранения примеров данных в файловом дескрипторе 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;
}