web-dev-qa-db-ja.com

Perlでファイルの行を配列に読み込むにはどうすればよいですか?

test.txtという名前のファイルがあります。これは次のようなものです。

テスト
Foo
バー

しかし、私は各行を配列に入れて、次のように行を出力したいと思います。

line1 line2 line3

しかし、どうすればこれを行うことができますか?

10
Nathan Campos
#!/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;
21
Corey

これが私のシングルライナーです:

_Perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt
_

説明:

  • ファイルを行ごとに_@a_配列に読み込みます
  • chomp(..)-各行のEOLシンボルを削除します
  • スペースを区切り文字として使用して_@a_を連結します
  • 結果の印刷
  • ファイル名をパラメータとして渡す
14
Ivan Nevostruev

ファイルを頻繁に丸呑みしていることに気付いた場合は、CPANの File :: Slurp モジュールを使用できます。

use strict;
use warnings;
use File::Slurp;

my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";
2
toolic

最も基本的な例は次のようになります。

#!/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)をchompingと交換してから、すべての要素を印刷/文字列化する必要があります。

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
2
Tamas Mezei

あなたが選ぶべきもう一つの答え:

#!/usr/bin/env Perl

open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);
2
Mark Byers

これは私が思いつくことができる最も単純なバージョンです:

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";
    }
'
1
Brad Gilbert

これはこれを行うコードです(script.pl内の以下のコードを想定しています):

use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";

それはによって実行されます:

scirpt.pl [your file]
1
dan