11

我是 Perl 新手,有人可以告诉我如何根据当前值附加输出文件的最后一个条目吗?例如,我正在生成一个输出 txt 文件说

a b c d 10

通过一些处理,我得到值 20,现在我希望分配这个值 20 并与之前的集合对齐

a b c d 10

并使其成为

a b c d 10 20
4

4 回答 4

13

假设最后一行没有换行符

use strict;
use warnings;

open(my $fd, ">>file.txt");
print $fd " 20";

如果最后一行已经有换行符,则输出将在下一行结束,即

a b c d 10
 20

在这两种情况下工作的更长版本将是

use strict;
use warnings;

open(my $fd, "file.txt");
my $previous;
while (<$fd>) {
    print $previous if ($previous);
    $previous = $_;
}

chomp($previous);
print "$previous 20\n";

但是,此版本不会修改原始文件。

于 2013-04-03T15:27:17.093 回答
6

尝试这样做

单行版本

perl -pe 'eof && do{chomp; print "$_ 20"; exit}' file.txt

脚本版本

#!/usr/bin/env perl

use strict; use warnings;

 while (defined($_ = <ARGV>)) {
    if (eof) {
        chomp $_;
        print "$_ 20";
        exit;
    }
}
continue {
    die "-p destination: $!\n" unless print $_;
}

样本输出

$ cat file.txt
a b c d 08
a b c d 09
a b c d 10


$ perl -pe 'eof && do{chomp; print "$_ 20"; exit}' file.txt
a b c d 08
a b c d 09
a b c d 10 20
于 2013-04-03T15:27:26.740 回答
4
perl -0777 -pe 's/$/ 20/' input.txt > output.txt

说明:通过使用 设置输入记录分隔符来读取整个文件,-0777对匹配文件结尾或最后一个换行符之前的读取数据执行替换。

您也可以使用该-i开关对输入文件进行就地编辑,但这种方法是有风险的,因为它会执行不可逆的更改。它可以与备份一起使用,例如-i.bak,但是该备份在多次执行时会被覆盖,所以我通常建议使用 shell 重定向,就像我在上面所做的那样。

于 2013-04-03T15:31:37.447 回答
0

首先读取整个文件,您可以通过以下子程序来完成read_file

sub read_file {
    my ($file) = @_;
    return do {
        local $/;
        open my $fh, '<', $file or die "$!";
        <$fh>
    };
}

my $text = read_file($filename);
chomp $text;
print "$text 20\n";
于 2015-11-20T11:25:52.950 回答