Почему не может я добавлять к середине массива со Связью Perl:: Файл?

Файл:

#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
1
задан toolic 7 June 2010 в 16:18
поделиться

1 ответ

Проблема не связана со связью, а связана с соединением .

Ваша проблема заключается в том, как вы используете 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
2
ответ дан 3 September 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: