私は Perl 初心者ですが、現在の値に基づいて出力ファイルの最後のエントリを追加する方法を誰か教えてもらえますか? たとえば、出力txtファイルを生成しています
a b c d 10
いくつかの処理で値 20 を取得し、この値 20 を割り当てて、前のセットと整列させたいと考えています。
a b c d 10
そしてそれを
a b c d 10 20
最後の行に改行がない場合
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";
ただし、このバージョンは元のファイルを変更しません。
ワンライナーバージョン
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
perl -0777 -pe 's/$/ 20/' input.txt > output.txt
説明: 入力レコード分離文字を で設定してファイル全体を読み取り、-0777
読み取ったデータに対して、ファイルの終わり、または最後の改行の直前に一致する置換を実行します。
-i
スイッチを使用して入力ファイルのインプレース編集を行うこともできますが、元に戻せない変更が行われるため、その方法は危険です。たとえば、バックアップと一緒に使用できます-i.bak
が、そのバックアップは複数の実行で上書きされるため、上記のように代わりにシェルリダイレクトを使用することを通常お勧めします。
最初にファイル全体を読み取ります。次のサブルーチンで実行できます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";