Файл:
#comment1
#comment2
#comment3
#START HERE
a: a@email.com
b: b@email.com
моя программа жемчуга:
use Data::Dumper;
use Tie::File;
tie my @array, 'Tie::File', 'ala.txt' or die $!;
my $rec = 'p: p@email.com';
my $flag =1 ;
my $add_flag = 0;
for my $i (0..$#array) {
next if ($array[$i] =~ /^\s*$/);
if ( $flag == 1 ) {
if ($array[$i] =~ /#START HERE/ ) {
$flag = 0;
}
else {
next ;
}
}
if (($array[$i] cmp $rec) == 1) {
splice @array, $i, 0, $rec;
$add_flag = 1;
last ;
}
}
if ( $add_flag == 0 ) {
my $index = $#array+1;
$array[$index] = $rec ;
}
конец добавления записи файла всегда. Я пытаюсь добавить к середине или начаться или закончиться как порядок aplphbetical
Редактирование 2:
Я хочу сделать со Связью:: ФАЙЛ только.
после того, как добавьте:
(после 2 выполнения)
#comment1
#comment2
#comment3
#START HERE
a: a@email.com
b: b@email.com
p: p@email.com
a: ab@email.com # if i add another record of a
Ожидание:
#comment1
#comment2
#comment3
#START HERE
a: a@email.com
a: ab@email.com
b: b@email.com
p: p@email.com
q: q@email.com
Проблема не связана со связью, а связана с соединением
.
Ваша проблема заключается в том, как вы используете splice
:
У вас должна быть ДЛИНА 0, а не 1
, потому что теперь вы удаляете 1 элемент массива по индексу ] $ i
перед добавлением вашей записи .
В вашем случае, скорее всего, все ваши тесты были предназначены для добавления чего-то вторым последним, поэтому вы удалили последний элемент и, таким образом, ваш элемент пошел до конца.
Попробуйте:
splice @array, $ i, 0, $ rec;
Вот мой тест:
$ cat ala.txt
#comment1
#comment2
#comment3
#START HERE
a: a@email.com
b: b@email.com
$ grep 'my $rec' junk/s2.pl
my $rec = 'p: p@email.com';
$ perl5.8 junk/s2.pl
$ cat ala.txt
#comment1
#comment2
#comment3
#START HERE
a: a@email.com
b: b@email.com
p: p@email.com
$ grep 'my $rec' junk/s2.pl
my $rec = 'a: ab@email.com # if i add another record of a';
$ perl5.8 junk/s2.pl
$ cat ala.txt
#comment1
#comment2
#comment3
#START HERE
a: ab@email.com # if i add another record of a
a: a@email.com
b: b@email.com
p: p@email.com
СТАРЫЙ ТЕСТ
Я скопировал весь ваш код, добавил my $ length = $ ARGV [0] || 0;
в начале и изменил строку splice
на splice @array, $ i, $ length, $ rec;
# Offset 1
$ cp ala_orig.txt ala.txt ; echo "BEFORE: #############" ; cat ala.txt ;
perl5.8 junk/s2.pl 1 ; echo "AFTER #############" ; cat ala.txt
BEFORE: #############
#aaa
#START HERE
b: x
c:y
u:a
z:y
AFTER #############
#aaa
#START HERE
b: x
c:y
p: p@email.com
z:y
# Offset 0
$ cp ala_orig.txt ala.txt ; echo "BEFORE: #############" ; cat ala.txt ;
perl5.8 junk/s2.pl 0 ; echo "AFTER #############" ; cat ala.txt
BEFORE: #############
#aaa
#START HERE
b: x
c:y
u:a
z:y
AFTER #############
#aaa
#START HERE
b: x
c:y
p: p@email.com
u:a
z:y