档案:
#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 ;
}
记录总是添加文件结尾。我试图添加到中间或开始或结束像aplphbetical订单
编辑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
答案 0 :(得分:2)
问题与领带无关,但与splice
无关。
您的问题在于如何使用splice
:
您需要LENGTH为0,而不是1
因为现在您在添加记录之前删除索引$i
处的1个数组元素。
在你的情况下,很有可能,你的所有测试都是为了添加一些东西,所以你删除了最后一个元素,因此,你的元素就到了最后。
尝试:
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
OLDER TEST
我复制了您的整个代码,在开头添加了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