tags:

views:

56

answers:

1

File :

#comment1
#comment2
#comment3
#START HERE

a:  [email protected]
b:  [email protected]

my perl program :

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

my $rec = 'p:                                        [email protected]';

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:  [email protected]
b:  [email protected]
p:                                        [email protected]
a:                                        [email protected] # if i add another record of a 

Expection :

#comment1
#comment2
#comment3
#START HERE

a:  [email protected]
a:  [email protected]
b:  [email protected]
p:                                        [email protected]
q:                                        [email protected]
+2  A: 

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:  [email protected]
b:  [email protected]

$ grep 'my $rec' junk/s2.pl
my $rec = 'p:                                        [email protected]';

$ perl5.8 junk/s2.pl

$ cat ala.txt
#comment1
#comment2
#comment3
#START HERE

a:  [email protected]
b:  [email protected]
p:                                        [email protected]

$ grep 'my $rec' junk/s2.pl
my $rec = 'a:          [email protected] # if i add another record of a';

$ perl5.8 junk/s2.pl

$ cat ala.txt
#comment1
#comment2
#comment3
#START HERE

a:          [email protected] # if i add another record of a
a:  [email protected]
b:  [email protected]
p:                                        [email protected]

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:                                        [email protected]
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:                                        [email protected]
u:a
z:y
DVK
its not working . Still it's adding into end
Tree
Please post ACTUAL error case that doesn't work (e.g. starting array and the record to add that's added to the end instead of middle, AFTER you fix splice to have 0 lengh. See my updated sample
DVK
when i use tie and file handling .its adding at end ..
Tree
i am looking for with tie file ... because i want to write into file
Tree
@SCNCN2010 - In order to help you further, you need to copy and paste: An exact program you used (with `splice` fixed as per my answer), your file's starting content, and the file's content after running the program, showing that the order was not preserved. Thanks
DVK
i have updated the question ./...
Tree
@SCNCN2010 - When I try to add your second "a:" record it gets before the first one, not at the end.
DVK