为什么我不能用Perl的Tie :: File添加到数组的中间?

时间:2010-06-07 09:07:50

标签: perl file

档案:

#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

1 个答案:

答案 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