为什么可以';t我用Perl';s Tie::文件?
文件: 我的perl程序:为什么可以';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:
#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