从.txt文件中读取第一行,从.text中删除它,并将所有其他行向上滑动1个单位

时间:2013-04-20 02:51:03

标签: perl

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

我不太确定如何继续:打开(我的$ l,'<',' Input.txt')或死"无法打开Input.txt:$!&#34 ;;

4 个答案:

答案 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。由于@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;

答案 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被写回文件。

希望这有帮助!