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
精彩评论