开发者

Why can't I add to the middle of an array with Perl's Tie::File?

开发者 https://www.devze.com 2023-01-02 18:21 出处:网络
File : #comment1 #comment2 #comment3 #START HERE a:a@email.com b:b@email.com my perl program : use Data::Dumper;

File :

#comment1
#comment2
#comment3
#START HERE

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

my perl program :

use Data::Dumper;
use Tie::File;
tie my @array, 'Tie::File', 'ala.txt' or die $!;

my $rec = 开发者_JAVA百科'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 ;

}

the recording adding end of file always . I am trying to add to middle or begin or end like aplphbetical order

Edit 2 :

I want to do with Tie::FILE only .

after add :

(after 2 execution )

#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 

Expection :

#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


The problem has nothing to do with tie, but with splice.

Your problem is with how you use splice:

  • You need to have LENGTH of 0, not 1

    because now you're removing 1 array element at index $i before adding your record.

    In your case, most likely, all your tests were meant to add something as second last, so you removed the last element and as such, your element went to the end.

Try:

splice @array, $i, 0, $rec;


Here's my test:

$ 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

OLDER TEST

I copied your entire code, added my $length = $ARGV[0] || 0; at the beginning and changed splice line to 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
0

精彩评论

暂无评论...
验证码 换一张
取 消