Почему я не могу добавить в середину массива с помощью Perl Tie :: File? - PullRequest
1 голос
/ 07 июня 2010

Файл:

#comment1
#comment2
#comment3
#START HERE

a:  a@email.com
b:  b@email.com

моя программа на Perl:

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 ;

}

запись, добавляющая конец файла всегда. Я пытаюсь добавить в середину или начать или закончить как аплбетический порядок

Редактировать 2:

Я хочу сделать только с Tie :: FILE.

после добавления:

(после 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 Ответ

2 голосов
/ 07 июня 2010

Проблема не имеет ничего общего с галстуком, но с splice.

Ваша проблема в том, как вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...