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 = '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
$ibefore 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:
OLDER TEST
I copied your entire code, added
my $length = $ARGV[0] || 0;at the beginning and changedspliceline tosplice @array, $i, $length, $rec;