test.txtという名前のファイルがあります。これは次のようなものです。
テスト
Foo
バー
しかし、私は各行を配列に入れて、次のように行を出力したいと思います。
line1 line2 line3
しかし、どうすればこれを行うことができますか?
#!/usr/bin/env Perl
use strict;
use warnings;
my @array;
open(my $fh, "<", "test.txt")
or die "Failed to open file: $!\n";
while(<$fh>) {
chomp;
Push @array, $_;
}
close $fh;
print join " ", @array;
これが私のシングルライナーです:
_Perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt
_
説明:
@a
_配列に読み込みますchomp(..)
-各行のEOLシンボルを削除します@a
_を連結しますファイルを頻繁に丸呑みしていることに気付いた場合は、CPANの File :: Slurp モジュールを使用できます。
use strict;
use warnings;
use File::Slurp;
my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";
最も基本的な例は次のようになります。
#!/usr/bin/env Perl
use strict;
use warnings;
open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = ();
while(<F>) { chomp; Push(@lines, $_); } # (2)
close(F);
print "@lines"; # (3) stringify
(1)はファイルが開かれる場所です。
(2)ファイルハンドルはリスト環境内でうまく機能するため(スカラー/リスト環境は左の値で定義されます)、配列をファイルハンドルに割り当てると、すべての行が配列に丸呑みされます。行は、入力レコード区切り文字である$/
の値で区切られます(終了します)。 use English;
の場合は、$IRS
または$INPUT_RECORD_SEPARATOR
を使用できます。この値のデフォルトは改行文字\n
です。
これはいい考えのように思えましたが、すべての行を印刷すると、末尾の\n
も印刷されるという事実を忘れてしまいました。ばかばかしい。
元々のコードは次のとおりです。
my @lines = <F>;
while
ループの代わりに。これはまだ実行可能な代替手段ですが、(3)をchomp
ingと交換してから、すべての要素を印刷/文字列化する必要があります。
for (@lines) { chomp; }
print "@lines";
(3)文字列化とは、配列を文字列に変換し、配列要素の間に値$"
を挿入することを意味します。これはデフォルトでスペースになります。
参照: perlvarページ 。
したがって、実際の2回目の試行は次のとおりです。
#!/usr/bin/env Perl
use strict;
use warnings;
open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = <F>; # (2)
close(F);
chomp(@lines);
print "@lines"; # (3) stringify
あなたが選ぶべきもう一つの答え:
#!/usr/bin/env Perl
open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);
これは私が思いつくことができる最も単純なバージョンです:
Perl -l040 -pe';' < test.txt
これはおおよそ次のものと同等です。
Perl -pe'
chomp; $\ = $/; # -l
$\ = 040; # -040
'
そして:
Perl -e'
LINE:
while (<>) {
chomp; $\ = $/; # -l
$\ = " "; # -040
} continue {
print or die "-p destination: $!\n";
}
'
これはこれを行うコードです(script.pl内の以下のコードを想定しています):
use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";
それはによって実行されます:
scirpt.pl [your file]