我有一个 .txt 文件,其中每一行只有一个元素。正如主题所暗示的,我想输入 .txt 中的第一行。然后,我想在输入后立即将其从 .txt 文件中删除。同时,我想将每个元素向上滑动一行,使前第二行元素成为新的第一行。
我不太确定如何继续: open(my $l, '<', 'Input.txt' ) or die "Can not open Input.txt: $!";
我有一个 .txt 文件,其中每一行只有一个元素。正如主题所暗示的,我想输入 .txt 中的第一行。然后,我想在输入后立即将其从 .txt 文件中删除。同时,我想将每个元素向上滑动一行,使前第二行元素成为新的第一行。
我不太确定如何继续: open(my $l, '<', 'Input.txt' ) or die "Can not open Input.txt: $!";
您无法从文件中删除。您可以简单地读取后面的每个字节并将它们写回较早的位置。这很昂贵,但使用 Tie::File 很容易做到。
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 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);
}
}
}
使用 时Tie::File
,您可以将文件绑定到 an @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;
这是另一种选择:
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::Slurpgrep
,并且仅当$i
不为零时才允许行通过,因此省略了第一行,并将第 2 .. n 行写回文件。
希望这可以帮助!