我有一个.txt文件,其中每行只有一个元素。正如主题所示,我想从.txt输入第一行。然后,我想在输入后立即将其从.txt文件中删除。同时,我想将每个元素向上滑动一行,使前一个第二行元素成为新的第一行。
我不太确定如何继续:打开(我的$ l,'<',' Input.txt')或死"无法打开Input.txt:$!&#34 ;;
答案 0 :(得分:2)
您无法从文件中删除。您可以简单地读取后面的每个字节,并将它们写回到较早的位置。这很昂贵,但使用Tie :: File很容易。
答案 1 :(得分:2)
use strict;
if ($#ARGV)
{
print "\nUsage: test.pl Filename\n\n";
exit();
}
my $f;
if (open($f, $ARGV[0]))
{
print scalar(<$f>);
my $s = join('', <$f>);
close($f);
if (open($f, '>', $ARGV[0]))
{
print $f $s;
close($f);
}
}
else print "\nCan't open input file $ARGV[0]\n\n";
或sub
sub slideFile($)
{
my $filename = shift();
my $f;
if (open($f, $filename))
{
<$f>;
my $s = join('', <$f>);
close($f);
if (open($f, '>', $filename))
{
print $f $s;
close($f);
}
}
}
答案 2 :(得分:2)
使用Tie::File
时,您可以将文件绑定到@array
,以便数组中的每个元素都对应于文件中的一行。
在以下示例中,shift
运算符会从@lines
中删除第一个元素,并将其分配给$first_line
。由于@lines
与file.txt
绑定,因此该文件中的第一行也会被删除。
use strict;
use warnings;
use Tie::File;
tie my @lines, 'Tie::File', 'file.txt' or die $!;
my $first_line = shift @lines;
print "first line WAS: $first_line\n";
untie @lines;
答案 3 :(得分:0)
这是另一种选择:
use strict;
use warnings;
use File::Slurp;
my $i = 0;
write_file $ARGV[0], grep $i++, read_file $ARGV[0];
用法:perl script.pl inFile
脚本在列表上下文中使用File::Slurp,而grep
仅在$i
不为零时允许行传递,因此第一行被省略,第2行被省略。 .n被写回文件。
希望这有帮助!