1

我有一个 .txt 文件,其中每一行只有一个元素。正如主题所暗示的,我想输入 .txt 中的第一行。然后,我想在输入后立即将其从 .txt 文件中删除。同时,我想将每个元素向上滑动一行,使前第二行元素成为新的第一行。

我不太确定如何继续: open(my $l, '<', 'Input.txt' ) or die "Can not open Input.txt: $!";

4

4 回答 4

2

您无法从文件中删除。您可以简单地读取后面的每个字节并将它们写回较早的位置。这很昂贵,但使用 Tie::File 很容易做到。

于 2013-04-20T02:54:20.587 回答
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 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);
        }
    }
}
于 2013-04-20T03:10:29.473 回答
2

使用 时Tie::File,您可以将文件绑定到 an @array,以便数组中的每个元素对应于文件中的一行。

在以下示例中,shift运算符从 中删除第一个元素@lines并将其分配给$first_line。由于@linesfile.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;
于 2013-04-20T20:36:46.633 回答
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::Slurpgrep ,并且仅当$i不为零时才允许行通过,因此省略了第一行,并将第 2 .. n 行写回文件。

希望这可以帮助!

于 2013-04-20T20:18:53.173 回答