为什么可以';t我用Perl';s Tie::文件?

为什么可以';t我用Perl';s Tie::文件?,perl,file,Perl,File,文件: 我的perl程序: #comment1 #comment2 #comment3 #START HERE a: a@email.com b: b@email.com 录制始终以文件结尾。我试着添加到中间或开始或结束像aplphbetical秩序 编辑2: 我只想使用Tie::FILE 添加后: (2次执行后) 期望: #comment1 #comment2 #comment3 #START HERE a: a@email.com b: b@email.com p:

文件:

我的perl程序:

#comment1
#comment2
#comment3
#START HERE

a:  a@email.com
b:  b@email.com
录制始终以文件结尾。我试着添加到中间或开始或结束像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 

问题与领带无关,而是与
拼接有关

您的问题在于如何使用
拼接

  • 您需要长度为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

这是我的测试:

#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

旧测试

我复制了您的整个代码,添加了
my$length=$ARGV[0]| | 0在开始处,并将
拼接
行更改为
拼接@array,$i,$length,$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

请发布不起作用的实际错误案例(例如,在将接头固定为0长度后,开始数组和要添加到末尾而不是中间的记录。请参阅我正在使用tie文件查找的更新样本…因为我想写入到中。)file@SCNCN2010-为了进一步帮助您,您需要复制并粘贴:您使用的确切程序(使用
splice
修复,根据我的回答),您的文件的起始内容,以及运行程序后的文件内容,表明顺序没有保留。Thanks@SCNCN2010-当我尝试添加你的第二个“a”:将它记录在第一个之前,而不是最后。请显示所需和实际的示例输出。提示:始终使用
使用严格;使用警告;
。并使用Data::Dumper检查您是否正在以您认为的方式修改数据结构。@Ether-他的代码(原样)通过严格和警告…尽管这是一个绝对正确的建议,要始终遵循。
# 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