Как я могу прочитать строки файла в массив в Perl?

У меня есть файл с именем .txt вот такой:

тест
Фу!--6--> Бар

но я хочу поместить каждую строку в массив и распечатать строки следующим образом:

line1 line2 line3

но как я могу это сделать?

7 ответов


#!/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 array
  • chomp(..) - удалить символы EOL для каждой строки
  • объединения @a использование пространства в качестве разделителя
  • напечатать результат
  • передать имя файла в качестве параметра

еще один ответ для вас на выбор:

#!/usr/bin/env perl

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

Если вы часто глотаете файлы, вы можете использовать File:: Slurp модуль от CPAN:

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) дескрипторы файлов хорошо работают в среде списка (скалярные среды/среды списка определяются левым значением), поэтому, если вы назначаете массив дескриптору файла, все строки слурпируются в массив. Строки разделяются (заканчиваются) значением $/ входной разделитель записей. Если ты ... --5-->, вы можете использовать $IRS или $INPUT_RECORD_SEPARATOR. Это значение по умолчанию символ новой строки \n;

хотя это казалось хорошей идеей, я просто забыл тот факт, что если вы напечатаете все строки, окончание \n будет напечатана. Внимание мне.

изначально код:

my @lines = <F>;

вместо while петли. Это все еще жизнеспособная альтернатива, но вы должны поменять (3) на chomping, а затем печать / строка всех элементов:

for (@lines) { chomp; }
print "@lines";

(3) Stringifying означает преобразование массив в строку и вставка значения $" между элементами массива. По умолчанию используется пробел.

посмотреть: страница 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

Это самая простая версия, которую я мог придумать:

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]